将KeyListener添加到JWindow没有获取任何键事件

时间:2010-06-10 23:37:24

标签: java swing 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 个答案:

答案 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)一起使用。

REGRESSION: JWindow stays on top of all other windows

答案 2 :(得分:-1)

我也有完全相同的问题...,我的解决方案是在我的包的一个类中我扩展了JFrame,关键监听器完美地工作,并且在paint方法中,我使用了{{1的图形实例... ...我画了窗口中的所有内容而不是JFrame ...在此之前我已经调用了window{Graphics g=win.getGraphics();}