1

在 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,所以我不确定这是否与平台有关。

谢谢

4

3 回答 3

1

您可以尝试将 添加Listener到您可以从中获取的内容窗格中,看看它是否有效。JWindowwindow.getContentPane().addKeyListener(..)

问题可能是,如果您在内部有焦点JWindow但不是JWindow自身,事件将被分派到内部焦点项目。您也可以尝试将 添加KeyListener到该窗口内的任何内容中。

编辑:在Sun 的论坛上搜索一下,似乎强制接受对JWindowAPI 的关注,你可能会做的是

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:一个复杂的解决方案可能是获取ActionMapwithgetActionMap()然后为所有仅缓冲它的键盘击键添加一个动作,然后您可以随时调度它们(例如在返回键之后)

于 2010-06-11T00:06:20.853 回答
1

看起来 JWindow 在 Linux 中几乎被破坏了。

解决方法是将 JFrame 与setUndecorated(true).

回归:JWindow 位于所有其他窗口之上

于 2010-06-11T01:12:11.240 回答
-1

我也遇到了完全相同的问题...,我的解决方案是在我的包的一个类中我扩展了 JFrame,关键侦听器在该类上工作得很好,在绘画方法中,我使用了window{Graphics g=win.getGraphics();}...的图形实例,我画了窗口 n 中的所有内容不在 JFrame 上...在此之前我已经调用了gd{graphicsdevice}.setFullScreenWindow(win);

于 2010-08-13T02:08:57.463 回答