2

当我用 F1 到 12 或 0 到 9 或 A 到 Z (所有按钮)按下键盘时。我没有看到它捕获我的键盘输入。我该如何解决?

public class Boot extends JWindow implements KeyListener
{
  public Boot() 
  {
    .....
    this.addKeyListener(this);
    ....
  }

  public void keyTyped(KeyEvent ke) 
  {
    System.out.println( ke.getKeyChar());
  }

  public void keyPressed(KeyEvent ke) 
  {
    System.out.println( ke.getKeyChar());

    /* KEY EVENTS */
    // KeyEvent.KEY_TYPED
    // KeyEvent.KEY_PRESSED
    // int id = id.getId();

  }

  public void keyReleased(KeyEvent ke) 
  {
    System.out.println( ke.getKeyChar());
  }

}
4

2 回答 2

4

KeyEvent 仅传递给可聚焦的组件。

阅读 JWindow() 构造函数的 API。它指出:

创建一个没有指定所有者的窗口。此窗口将无法聚焦。

阅读 JWindow(Frame) 构造函数的 API。它指出:

创建具有指定所有者框架的窗口。如果所有者为空,则将使用共享所有者,并且此窗口将不可聚焦。此外,除非其所有者显示在屏幕上,否则此窗口将无法聚焦。

所以基本上你还需要在使用 JWindow 时创建一个可见的 JFrame。

JFrame frame = new JFrame();
frame.setVisible( true );
JWindow window = new JWindow(frame);

我在论坛上看到的一个 hack 是使用:

JWindow window = new JWindow(new JFrame("is Showing")
{
   public boolean isShowing()
   {
     return true;
   }
});

或者更好的方法是使用未装饰的 JFrame,您不必担心这一点。

于 2011-11-09T15:35:21.130 回答
0

【KeyEvent的Java API】

getKeyChar 方法总是返回一个有效的 Unicode 字符或 CHAR_UNDEFINED。字符输入由 KEY_TYPED 事件报告:KEY_PRESSED 和 KEY_RELEASED 事件不一定与字符输入相关联。因此,保证 getKeyChar 方法的结果只对 KEY_TYPED 事件有意义。

对于按键按下和按键释放事件,getKeyCode 方法返回事件的 keyCode。对于键类型事件,getKeyCode 方法总是返回 VK_UNDEFINED。

对释放的键使用 getKeyCode。 KeyEvent.F1, F2, ... 可用于功能键。

于 2011-11-09T15:01:42.270 回答