【问题标题】:Adding KeyListener to a JWindow not getting any key events将 KeyListener 添加到 JWindow 没有得到任何关键事件
【发布时间】:2010-06-10 23:37:23
【问题描述】:

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

谢谢

【问题讨论】:

  • 你为什么要使用 JWindow 而不是 JFrame? (我很好奇我希望不是因为装饰品)

标签: java swing keylistener jwindow


【解决方案1】:

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

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

编辑: 在Sun's forum 上搜索一下似乎,强制接受对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,然后为所有键盘击键添加一个动作来缓冲它,然后你可以随时调度它们(例如在返回键之后)

【讨论】:

  • 我已经尝试使用 getContentPane() 添加它。至于某些东西有焦点的可能性,我尝试了一个空的JWindow,问题仍然存在。一旦我切换到 JFrame 或 JDialog 而没有任何进一步的更改,监听器似乎就可以工作了。
  • @Support - 多语言 SO:我很惊讶。您关于扩展 JWindow 的问题仍然存在。
【解决方案2】:

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

解决方法是使用带有setUndecorated(true) 的JFrame。

REGRESSION: JWindow stays on top of all other windows

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 2022-01-13
      • 1970-01-01
      • 2013-12-24
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多