Имитация клавиши ввода в Swing (без использования робота) - PullRequest
4 голосов
/ 15 марта 2012

Итак, я пытаюсь написать JButton, который при нажатии будет действовать как клавиша ввода.Он должен быть в состоянии обмануть JTextField, который находится в фокусе, для вызова своих слушателей действий.Он не может использовать каркас робота, потому что это заставит каждую программу думать, что ввод нажат, что является проблемой.

Вот предыстория:

У меня есть программа (написанная на Swing)который позволяет кому-то вводить данные во многие текстовые поля и другие объекты, нажимая клавишу ввода после ввода данных.Это прекрасно работает.

Однако большинство людей, которые используют его, одновременно используют вторую программу, которая автоматически прослушивает клавишу ввода и отключает робота (для тех из вас, кто знаком с роботами FIRST,Я говорю о SmartDashboard и Driver Station).Было довольно много жалоб по этому поводу.Люди хотят вводить данные без отключения робота.Оказывается, SmartDashboard (программа, в которую хотят войти пользователи), позволяет запускать пользовательские компоненты свинга вместе с ней.

Ответы [ 3 ]

4 голосов
/ 15 марта 2012

не совсем уверен, правильно ли я понимаю ваше требование (удалит это, если нет) ...

Вы можете вручную отправить событие любому компоненту, к которому хотите обратиться.В случае необходимости отправки в focusOwner

  • найдите focusOwner, запросив у KeyboardFocusManager
  • создать keyEvent с focusOwner в качестве отправителя
  • отправить это событие вfocusOwner

Что-то вроде:

Action action = new AbstractAction("fake enter") {

    @Override
    public void actionPerformed(ActionEvent e) {
        KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
        Component comp = manager.getFocusOwner();
        KeyEvent event = new KeyEvent(comp, 
                KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, 
                KeyEvent.VK_ENTER, KeyEvent.CHAR_UNDEFINED);
        comp.dispatchKeyEvent(event);
    }
};
JButton button = new JButton(action);
button.setFocusable(false);

Action textAction = new AbstractAction("text") {

    @Override
    public void actionPerformed(ActionEvent e) {
        LOG.info("I'm the text action" + ((Component) e.getSource()).getName());
    }
};

JComponent comp = Box.createVerticalBox();
for (int i = 0; i < 5; i++) {
    JTextField field = new JTextField(20);
    field.setName(": " + i);
    field.setAction(textAction);
    comp.add(field);
}
comp.add(button);

Редактировать

добавлены некоторые строки для фактической игры с ним (@Joe прокомментировал, что это не такза работой).Нажатие на кнопку запускает действие сфокусированного textField (здесь просто выводится имя поля). Локальный контекст - это vista и jdk6u27.

2 голосов
/ 15 марта 2012

Захват элемента с фокусом и ручная отправка события ввода не совсем работали, но, поскольку я просто хотел воздействовать на различные JTextField, я нашел похожее решение:

addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
        Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
        if (focusOwner instanceof JTextField) {
            ((JTextField) focusOwner).postActionEvent();
        }
    }   
});

Спасибо зауказывает мне в правильном направлении.

2 голосов
/ 15 марта 2012

Вы можете попробовать getRootPane().setDefaultButton() на кадре.Вот пример здесь .

...