Безразличный KeyListener для JFrame

78
задан Nathan 21 January 2016 в 21:59
поделиться

5 ответов

Необходимо добавить keyListener к каждому компоненту, в котором Вы нуждаетесь. Только компонент с фокусом отправит эти события. Например, если у Вас есть только один TextBox в Вашем JFrame, что TextBox имеет фокус. Таким образом, необходимо добавить KeyListener к этому компоненту также.

процесс является тем же:

myComponent.addKeyListener(new KeyListener ...);

Примечание: Некоторые компоненты не focusable как JLabel.

установка For их к focusable Вы должны:

myComponent.setFocusable(true);
46
ответ дан bruno conde 24 November 2019 в 10:27
поделиться

KeyListener низкий уровень и применяется только к единственному компоненту. Несмотря на попытки сделать его больше применимый JFrame создает много компонентов компонента, самое очевидное существо довольное область. JComboBox UI также часто реализуется подобным образом.

стоит отметить работу событий от нажатия мыши странным способом, немного отличающимся к ключевым событиям.

для получения дополнительной информации на том, что необходимо сделать, см. мой ответ на Приложение широкое сочетание клавиш - Java Swing.

10
ответ дан Community 24 November 2019 в 10:27
поделиться

Хм.. для чего класс является Вашим конструктором? Вероятно, некоторый класс, расширяющий JFrame? Фокус окна должен быть в окне, конечно, но я не думаю, что это - проблема.

я развернул Ваш код, который попробовали для выполнения его, и это работало - нажатия клавиш закончились как вывод печати. (выполненный с Ubuntu через Eclipse):

public class MyFrame extends JFrame {
    public MyFrame() {
        System.out.println("test");
        addKeyListener(new KeyListener() {
            public void keyPressed(KeyEvent e) {
                System.out.println("tester");
            }

            public void keyReleased(KeyEvent e) {
                System.out.println("2test2");
            }

            public void keyTyped(KeyEvent e) {
                System.out.println("3test3");
            }
        });
    }

    public static void main(String[] args) {
        MyFrame f = new MyFrame();
        f.pack();
        f.setVisible(true);
    }
}
2
ответ дан CSchulz 24 November 2019 в 10:27
поделиться

У меня была та же проблема, пока я не прочитал, что настоящая проблема связана с FOCUS, поскольку ваш JFrame уже добавил слушателей, но кадр тура никогда не находится на Focus, потому что в вашем JFrame есть много компонентов, которые также могут быть сфокусированы, поэтому попробуйте:

JFrame.setFocusable(true);

Удачи

10
ответ дан 24 November 2019 в 10:27
поделиться

Если вы не хотите регистрировать прослушиватель для каждого компонента,
вы можете добавить свой собственный KeyEventDispatcher в KeyboardFocusManager :

public class MyFrame extends JFrame {    
    private class MyDispatcher implements KeyEventDispatcher {
        @Override
        public boolean dispatchKeyEvent(KeyEvent e) {
            if (e.getID() == KeyEvent.KEY_PRESSED) {
                System.out.println("tester");
            } else if (e.getID() == KeyEvent.KEY_RELEASED) {
                System.out.println("2test2");
            } else if (e.getID() == KeyEvent.KEY_TYPED) {
                System.out.println("3test3");
            }
            return false;
        }
    }
    public MyFrame() {
        add(new JTextField());
        System.out.println("test");
        KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
        manager.addKeyEventDispatcher(new MyDispatcher());
    }

    public static void main(String[] args) {
        MyFrame f = new MyFrame();
        f.pack();
        f.setVisible(true);
    }
}
128
ответ дан 24 November 2019 в 10:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: