Java 将KeyListener添加到JWindow时未获取任何键事件

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

在Java中,我向JWindow添加了一个KeyListener,但它没有获得任何键事件。如果我使用了相同的代码,但是扩展了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,所以我不确定这是否与平台有关


谢谢

您可以尝试将
侦听器添加到
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?(我很好奇,我希望不是因为装饰)