【问题标题】:KeyListener, keyPressed versus keyTypedKeyListener、keyPressed 与 keyTyped
【发布时间】:2011-10-27 15:46:09
【问题描述】:

我有一个 JFrame(嗯,一个扩展 JFrame 的类),我想在按下 F5 键时执行一个操作。所以,我让这个类实现了 KeyListener。随之而来的是三种方法,keyPressed、keyReleased 和 keyTyped。

我应该使用哪些方法来监听 F5 是否被按下? keyPressed 还是 keyTyped?我目前有以下内容,但是当我按 F5 时它不会打印任何内容。

public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_F5)
        System.out.println("F5 pressed");
}

public void keyReleased(KeyEvent arg0) {
    // TODO Auto-generated method stub

}

public void keyTyped(KeyEvent arg0) {
    // TODO Auto-generated method stub

}

【问题讨论】:

  • Swing 被设计为使用键绑定,而不是 KeyListener。

标签: java swing jframe key-bindings keylistener


【解决方案1】:
private String message;
private ScreenManager s;


//Here is an example of code to add the keyListener() as suggested; modify 
public void init(){
Window w = s.getFullScreenWindow();
w.addKeyListener(this);

public void keyPressed(KeyEvent e){
    int keyCode = e.getKeyCode();
        if(keyCode == KeyEvent.VK_F5)
            message = "Pressed: " + KeyEvent.getKeyText(keyCode);
}

【讨论】:

  • 每个代码 sn-p 至少应该有一两句话来解释您要解决的问题的哪一部分。
  • 如上所述,keyListener() 监听一个按键事件。在响应 keyPressed() 的代码之前加上 addKeyListener()。我包含了一个 sn-p 代码作为示例,您可以对其进行修改。
【解决方案2】:

如果你想要立即生效,你应该使用keyPressed,如果你想要释放按键后的效果,你应该使用keyReleased。您不能使用keyTyped,因为 F5 不是字符。 keyTyped 仅在按下字符时激活。

【讨论】:

  • 请不要使用短信缩写。另外,这个问题前段时间已经回答了。最好不要恢复旧线程,除非响应添加了以前答案中缺少的重要内容。
【解决方案3】:

两者都不是。你不应该使用 KeyLIsener。

Swing 旨在与键绑定一起使用。阅读 How to Use Key Bindings 上的 Swing 教程中的部分。

【讨论】:

  • 好建议。我是一个皈依者,之前应该更了解;)
【解决方案4】:
keyPressed - when the key goes down
keyReleased - when the key comes up
keyTyped - when the unicode character represented by this key is sent by the keyboard to system input.

我个人会为此使用 keyReleased。只有当他们抬起手指时它才会触发。

请注意,keyTyped 仅适用于可以打印的内容(我不知道 F5 是否可以),并且我相信如果按住键会一遍又一遍地触发。这对于诸如...在屏幕上移动角色之类的东西很有用。

【讨论】:

  • 您好,谢谢您的回答。请查看我修改后的问题
  • 如果你没有从中得到任何东西,那可能是因为你忘了添加你的监听器。如果您在任何地方都没有addListener 方法调用,则需要添加一个。如果您发布一些代码,我可以提供帮助。
  • 是的,忘记添加监听器
  • 为了记录,我通常使用keyReleased而不是keyPressed,这样如果他们真的不想做他们正在做的事情,他们可以按住键而不是让它走了,然后按逃生。然后,我在内部保留一个布尔值,以确定转义是否关闭(如果是转义,则按下键,它将布尔值设置为真,如果转义,则在释放的键上将布尔值设置为假),我不让他们做任何其他事情如果按下了转义,则执行操作。只是一些思考的食物。干杯
  • ...而 unicodes 是通过在使用右侧数字键盘键入字符代码的同时按住 ALT 来完成的。这就是为什么我以前从来没有用 java 听过他们......
猜你喜欢
  • 2013-07-21
  • 1970-01-01
  • 2015-11-09
  • 2014-04-02
  • 1970-01-01
  • 2011-07-09
  • 2012-12-11
  • 2015-01-03
  • 2012-11-15
相关资源
最近更新 更多