如何使用Java在我的JWindow中捕获键盘输入?

时间:2011-11-09 14:57:19

标签: java linux swing fedora key-events

当我按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());
  }

}

2 个答案:

答案 0 :(得分:4)

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

阅读JWindow()构造函数的API。它声明:

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

阅读JWindow(Frame)构造函数的API。它声明:

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

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

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

我在论坛上看到的黑客是使用:

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

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

答案 1 :(得分: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,...可用于功能键。