Необходимо добавить keyListener к каждому компоненту, в котором Вы нуждаетесь. Только компонент с фокусом отправит эти события. Например, если у Вас есть только один TextBox в Вашем JFrame, что TextBox имеет фокус. Таким образом, необходимо добавить KeyListener к этому компоненту также.
процесс является тем же:
myComponent.addKeyListener(new KeyListener ...);
Примечание: Некоторые компоненты не focusable как JLabel.
установка For их к focusable Вы должны:
myComponent.setFocusable(true);
KeyListener
низкий уровень и применяется только к единственному компоненту. Несмотря на попытки сделать его больше применимый JFrame
создает много компонентов компонента, самое очевидное существо довольное область. JComboBox
UI также часто реализуется подобным образом.
стоит отметить работу событий от нажатия мыши странным способом, немного отличающимся к ключевым событиям.
для получения дополнительной информации на том, что необходимо сделать, см. мой ответ на Приложение широкое сочетание клавиш - Java Swing.
Хм.. для чего класс является Вашим конструктором? Вероятно, некоторый класс, расширяющий 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);
}
}
У меня была та же проблема, пока я не прочитал, что настоящая проблема связана с FOCUS, поскольку ваш JFrame уже добавил слушателей, но кадр тура никогда не находится на Focus, потому что в вашем JFrame есть много компонентов, которые также могут быть сфокусированы, поэтому попробуйте:
JFrame.setFocusable(true);
Удачи
Если вы не хотите регистрировать прослушиватель для каждого компонента,
вы можете добавить свой собственный 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);
}
}