Невозможно установить фокус для ввода с клавиатуры с помощью пользовательского интерфейса WindowBuilder SWING

Я написал базовую программу типа калькулятора, используя WindowsBuilder в Eclise neon и Java 1.8. Он почти завершен, все работает так, как я хочу. Кроме ввода с клавиатуры.

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

Я добавил "реализует KeyListener" в класс программы...

public class CashRegister implements KeyListener {
    private JTextField keyb;

Я попытался настроить слушателя на невидимый JTextField, называемый keyb....

private void initialize() {
    keyb = new JTextField(20);
    keyb.addKeyListener(this);
    keyb.setFocusable(true);
    keyb.requestFocusInWindow();

И я добавил методы для обработки захваченного нажатия клавиши...

public void keyTyped (KeyEvent e) {
    String out = "";
    out = out + e.getKeyChar();
    pence1text.setText(out);
}
public  void keyPressed (KeyEvent e) {

}
public  void keyReleased (KeyEvent e) {

}

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

Думаю проблема может быть в фокусе. Погуглив и проверив stackoverlow, я добавил следующие строки...

    keyb.setFocusable(true);
    keyb.requestFocusInWindow();

как указано выше, но все равно не повезло.

У кого-нибудь есть идеи, что я делаю неправильно, или что я могу попробовать дальше?

Спасибо


person BSS-Applications    schedule 02.05.2017    source источник
comment
public boolean requestFocusInWindow() Какое значение возвращается boolean? Держу пари, это false.   -  person Andrew Thompson    schedule 02.05.2017
comment
Да, возвращает ложь. Я так понимаю проблема в нем. Что я пропустил? Спасибо.   -  person BSS-Applications    schedule 02.05.2017
comment
Попробуйте прочитать эту статью. Зарегистрируйте все свои действия для корневой панели с помощью модификатора JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT.   -  person Sergiy Medvynskyy    schedule 02.05.2017
comment
Что я пропустил? документацию вместе со ссылкой на полное описание метода?   -  person Andrew Thompson    schedule 02.05.2017
comment
Предпочтение отдается прослушиванию изменений в документе. до KeyListener   -  person MadProgrammer    schedule 02.05.2017
comment
Не уверен, что вы видели комментарий @MadProgrammer с тех пор, как ввели ответ, но я подозреваю, что они попали в самую точку. Я говорю «подозреваю» только потому, что увидел в заголовке «фокус», проверил код и сделал поспешные выводы на основе этой распространенной проблемы.   -  person Andrew Thompson    schedule 02.05.2017
comment
@ Эндрю Томпсон, спасибо за помощь. Не уверен на 100%, что ссылка MadProgrammer — это то, что я искал. Может быть, это другой/лучший способ справиться с тем, что я пытался сделать. Однако ваша ссылка на документацию направила меня в работоспособном направлении. Я переместил KeyListener в другой компонент, который всегда виден, и настроил его на запрос фокуса всякий раз, когда пользователь перемещает его, нажимая кнопку. Конечное приложение работало так, как мне нужно, так что все хорошо! В следующий раз, когда мне нужно будет сделать что-то подобное, я более подробно рассмотрю другую ссылку.   -  person BSS-Applications    schedule 02.05.2017
comment
@BSS-Applications Поскольку мы на самом деле не знаем, что вы пытаетесь сделать, трудно сделать предложение, однако, как правило, вы не должны использовать KeyListener с текстовыми компонентами, DocumentListener, DocumentFilter и привязки клавиш API - все лучшие решения... в зависимости от того, что вы пытаетесь сделать   -  person MadProgrammer    schedule 03.05.2017
comment
В качестве последнего штриха я хотел бы обнаруживать события keyTyped и сопоставлять их с нажатиями кнопок, чтобы пользователи могли использовать для ввода клавиатуру, а не нажимать кнопки мышью. Хорошо, но что делать с текстовое поле? Кнопки уже поддерживают сочетания клавиш (мнемоники)   -  person MadProgrammer    schedule 03.05.2017


Ответы (2)


Спасибо пользователю Эндрю Томпсону за то, что он указал мне на документы и перечитал.

Проблема в том, что JTextField невидим и, следовательно, не может быть сфокусирован. Если я добавлю слушателя в видимое текстовое поле, программа будет работать правильно. Однако, если пользователь использует мышь, чтобы щелкнуть кнопку, он теряет фокус и нарушает реализацию... поэтому мне нужно переосмыслить код и продолжить просмотр настроек фокуса.

person BSS-Applications    schedule 02.05.2017

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

Не используйте KeyListener.

Вместо этого вы должны использовать Key Bindings. Прочтите раздел руководства Swing по Как использовать привязки клавиш основную информацию.

Также проверьте: как поместить actionlistenerand actioncommand в несколько jbuttons для рабочего примера, показывающего, как можно применить привязки клавиш к калькулятору.

person camickr    schedule 02.05.2017