【问题标题】:Weird behavior of keyboard events in JavaJava中键盘事件的奇怪行为
【发布时间】:2011-12-05 12:27:46
【问题描述】:

当我按下键盘上的"Delete" 按钮时,程序会收到三个事件-KEY_PRESSEDKEY_TYPEDKEY_RELEASED。问题是,在KEY_PRESSEDKEY_RELEASED 中设置了参数"keyCode",但在KEY_TYPED 中却没有设置(事实上,在该事件中没有有意义的信息)。使用F5 键,就更有趣了——KEY_PRESSEDKEY_RELEASED 被注册,但KEY_TYPED 永远不会出现。

监听器是通过Toolkit.getDefaultToolkit().addAWTEventListener() 添加的。使用 JDK 6.26。

我的问题可能是什么?

编辑: 以下是按下Delete 键时发生的事件:

 java.awt.event.KeyEvent[KEY_PRESSED,keyCode=127,keyText=Delete,keyChar=Delete,keyLocation=KEY_LOCATION_STANDARD,rawCode=119,primaryLevelUnicode=127,scancode=0] on javax.swing.JButton[,0,0,61x30,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.synth.SynthBorder@50f38cf0,flags=288,maximumSize=,minimumSize=,preferredSize=,defaultIcon=javax.swing.ImageIcon@6ae2d0b2,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=SVG,defaultCapable=false]
 java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar=Delete,keyLocation=KEY_LOCATION_UNKNOWN,rawCode=0,primaryLevelUnicode=127,scancode=0] on javax.swing.JButton[,0,0,61x30,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.synth.SynthBorder@50f38cf0,flags=288,maximumSize=,minimumSize=,preferredSize=,defaultIcon=javax.swing.ImageIcon@6ae2d0b2,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=SVG,defaultCapable=false]
 java.awt.event.KeyEvent[KEY_RELEASED,keyCode=127,keyText=Delete,keyChar=Delete,keyLocation=KEY_LOCATION_STANDARD,rawCode=119,primaryLevelUnicode=127,scancode=0] on javax.swing.JButton[,0,0,61x30,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.synth.SynthBorder@50f38cf0,flags=288,maximumSize=,minimumSize=,preferredSize=,defaultIcon=javax.swing.ImageIcon@6ae2d0b2,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=SVG,defaultCapable=false]

【问题讨论】:

  • 这里有什么问题?你检查这是否是正常行为?如果是这样,如果它没有你需要的信息,你是否可以不只是有一个 if 语句忽略事件,如果它等于 KEY_TYPED?
  • @Mike - 我的问题是,当用户在他的键盘上键入 Del 或 F5 时,我真的需要知道。
  • 您不能从 KEY_PRESSED keyCode 中获取该信息吗?
  • 常见问题:a) 为什么需要 keyListener b) 为什么需要全局锤子? (两者都与 keyBindings 相对)
  • 全局快捷方式听起来像是键绑定的用例 :) 使用 WHEN_IN_FOCUSED_WINDOW 类型的 rootPane 的 inputMap 注册

标签: java swing keyboard keyboard-shortcuts keylistener


【解决方案1】:
  • 最好是实现KeyBindings

  • 部分键盘为内置 JComponent 功能的保留键,更多信息来自@camickrs UIManager Defaults

  • 取决于你为什么需要实现 KeyListener 的原因,因为对于各种 JComponent 有很多其他的 Listener,应该过滤或注册内部的文本更改

  • 一些 JComponent 模型通过鼠标和键盘输入生成事件

【讨论】:

  • +1 用于键绑定。您很少需要使用 KeyListener 来满足这样的要求。
【解决方案2】:

来自JavaDoc The "key typed" event. This event is generated when a character is entered. In the simplest case, it is produced by a single key press. Often, however, characters are produced by series of key presses, and the mapping from key pressed events to key typed events may be many-to-one or many-to-many.

您正在尝试获取可能未注册为正在输入的字符的 F5 键。通过使用 KEY_RELEASED,您将始终如一地获得您正在寻找的结果,并且 API 的行为符合预期。

【讨论】:

    【解决方案3】:

    键类型事件总是生成“0”作为键代码。改为查找方法 getKeyChar() ,或者(如建议的那样)改为侦听 keyReleased() 。 getKeyChar(): http://goo.gl/ajH03

    【讨论】:

      猜你喜欢
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 2022-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多