Java 将KeyListener添加到JWindow时未获取任何键事件
在Java中,我向JWindow添加了一个KeyListener,但它没有获得任何键事件。如果我使用了相同的代码,但是扩展了JFrame,那么一切都很好Java 将KeyListener添加到JWindow时未获取任何键事件,java,swing,keylistener,jwindow,Java,Swing,Keylistener,Jwindow,在Java中,我向JWindow添加了一个KeyListener,但它没有获得任何键事件。如果我使用了相同的代码,但是扩展了JFrame,那么一切都很好 public class MyWindow extends JWindow { ... ... private void initComponents() { ... ... addKeyListener(new KeyListener() { pu
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,所以我不确定这是否与平台有关
谢谢您可以尝试将
侦听器添加到JWindow
的内容窗格中,您可以从window.getContentPane().addKeyListener(…)
获取该内容窗格,以查看它是否有效
问题可能是,如果某个焦点在JWindow
内,但不是JWindow
本身,则事件将被分派到内部焦点项目。您还可以尝试将keylister
添加到该窗口中的任何内容中
编辑:
稍微搜索一下,似乎要强制接受焦点在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);
}
}
EDIT2:一个复杂的解决方案可能是使用getActionMap()
获取ActionMap
,然后为所有键盘击键添加一个操作,该操作只是缓冲它,然后您可以随时调度它们(例如,在返回键之后)您可以尝试将侦听器添加到JWindow
的内容窗格中,您可以从window.getContentPane().addKeyListener(…)
获取该内容窗格,以查看其是否有效
问题可能是,如果某个焦点在JWindow
内,但不是JWindow
本身,则事件将被分派到内部焦点项目。您还可以尝试将keylister
添加到该窗口中的任何内容中
编辑:
稍微搜索一下,似乎要强制接受焦点在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);
}
}
EDIT2:一个复杂的解决方案可能是使用getActionMap()
获取ActionMap
,然后为所有键盘击键添加一个动作,该动作只是缓冲它,然后您可以随时调度它们(例如,在返回键之后)看起来JWindow在Linux中几乎崩溃了
解决方法是将JFrame与setUndercorated(true)
一起使用
看起来JWindow在Linux中几乎已经崩溃了
解决方法是将JFrame与setUndercorated(true)
一起使用
我也遇到了完全相同的问题…,我的解决方案是,在我的包的一个类中,我扩展了JFrame,key listener可以在JFrame上完美工作,在paint方法中,我使用了窗口{graphics g=win.getGraphics();}的图形实例
…我在窗口中绘制了所有内容,而不是在JFrame上……在此之前,我已经调用了gd{graphicsdevice}.setFullScreenWindow(win)代码>我也遇到了完全相同的问题…,我的解决方案是,在我的包的一个类中,我扩展了JFrame,key listener可以在JFrame上完美地工作,在paint方法中,我使用了窗口{graphics g=win.getGraphics();}的图形实例
…我在窗口中绘制了所有内容,而不是在JFrame上……在此之前,我已经调用了gd{graphicsdevice}.setFullScreenWindow(win)代码>我已尝试使用getContentPane()添加它。至于某些东西有焦点的可能性,我尝试了一个空的JWindow,但问题仍然存在。一旦我切换到JFrame或JDialog而不做任何进一步的更改,侦听器似乎就可以工作了。@Support-multi-language所以:我很惊讶。您关于扩展JWindow
的问题仍然存在。我已经尝试使用getContentPane()添加它。至于某些东西有焦点的可能性,我尝试了一个空的JWindow,但问题仍然存在。一旦我切换到JFrame或JDialog而不做任何进一步的更改,侦听器似乎就可以工作了。@Support-multi-language所以:我很惊讶。关于扩展JWindow
的问题仍然存在。为什么要尝试使用JWindow而不是JFrame?(我很好奇,我希望不是因为装饰)你为什么要用JWindow而不是JFrame?(我很好奇,我希望不是因为装饰)