在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,所以我不确定它是否与平台有关。
由于
答案 0 :(得分:1)
您可以尝试将Listener
添加到JWindow
的内容窗格中,以便window.getContentPane().addKeyListener(..)
获取JWindow
以查看它是否有效。
问题可能是,如果你有一些焦点在JWindow
内,但它不是KeyListener
本身,事件将被调度到内部焦点项目。您也可以尝试将JWindow
添加到该窗口内的任何内容中。
编辑:
在Sun's forum上搜索一下,强制接受对JWindow myWindow = ...
myWindow.setFocusableWindowState(true);
myWindow.setFocusable(true);
API的关注似乎是
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);
}
}
:
ActionMap
EDIT2:复杂的解决方案可能是getActionMap()
加{{1}},然后为所有键盘按键添加一个只缓冲它的动作,然后你可以随时调度它们(返回键后)例如)
答案 1 :(得分:1)
看起来JWindow在Linux中已经崩溃了。
解决方法是将JFrame与setUndecorated(true)
一起使用。
答案 2 :(得分:-1)
我也有完全相同的问题...,我的解决方案是在我的包的一个类中我扩展了JFrame,关键监听器完美地工作,并且在paint方法中,我使用了{{1的图形实例... ...我画了窗口中的所有内容而不是JFrame ...在此之前我已经调用了window{Graphics g=win.getGraphics();}