Добавление KeyListener в JWindow без получения каких-либо ключевых событий
В Java я добавляю KeyListener в JWindow, но он не получает никаких ключевых событий. Если я использовал тот же код, но вместо этого расширил JFrame, то все работает нормально.
public class MyWindow extends JWindow {
...
...
private void initComponents() {
...
...
addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
System.out.println("KEY PRESSED: " + e.getKeyCode());
}
public void keyReleased(KeyEvent e) {
System.out.println("KEY RELEASED: " + e.getKeyCode());
}
public void keyTyped(KeyEvent e) {
System.out.println("KEY TYPED: " + e.getKeyCode());
}
});
}
}
Кто-нибудь знает, как я могу решить эту проблему с помощью JWindow?
Обратите внимание, что я использую Linux, поэтому я не уверен, что это как-то связано с платформой.
Спасибо
3 ответа
Похоже, что в Linux JWindow практически не работает.
Обходной путь должен использовать JFrame с setUndecorated(true)
,
Вы можете попробовать, добавив Listener
на панели содержимого вашего JWindow
что вы можете получить от window.getContentPane().addKeyListener(..)
чтобы увидеть, работает ли это.
Проблема может быть в том, что если у вас есть что-то сфокусированное внутри JWindow
но это не JWindow
сами события будут отправляться на внутренне сфокусированный элемент. Вы также можете попробовать, добавив KeyListener
к тому, что у вас есть в этом окне..
РЕДАКТИРОВАТЬ: Поиск немного на форуме Sun кажется, что, чтобы заставить акцент на JWindow
API вы можете сделать это
JWindow myWindow = ...
myWindow.setFocusableWindowState(true);
myWindow.setFocusable(true);
если это все еще не работает, лучшее решение состоит в том, чтобы использовать JFrame
:
public class WindowTest {
public static void main(String[] args) {
JFrame frame = new JFrame();
// remove menu bar and title bar
frame.setUndecorated(true);
frame.setVisible(true);
JWindow window = new JWindow(frame); // this works
window.setBounds(0, 50, 200, 200);
window.setVisible(true);
}
}
- http://forums.sun.com/thread.jspa?threadID=489740&forumID=57
- http://forums.sun.com/thread.jspa?threadID=489740&forumID=57
EDIT2: комплексное решение может быть, чтобы получить ActionMap
с getActionMap()
а затем добавьте действие для всех нажатий клавиш клавиатуры, которые просто буферизуют его, затем вы можете отправлять их в любое время (например, после клавиши возврата)
У меня тоже была точно такая же проблема..., мое решение состояло в том, что в одном классе моего пакета я расширил JFrame, на котором ключевой слушатель работает отлично, а в методе рисования я использовал графический экземпляр window{Graphics g=win.getGraphics();}
... и я нарисовал все в окне, а не на JFrame... до этого я уже позвонил gd{graphicsdevice}.setFullScreenWindow(win);