Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中键盘事件的奇怪行为_Java_Swing_Keyboard_Keyboard Shortcuts_Keylistener - Fatal编程技术网

Java中键盘事件的奇怪行为

Java中键盘事件的奇怪行为,java,swing,keyboard,keyboard-shortcuts,keylistener,Java,Swing,Keyboard,Keyboard Shortcuts,Keylistener,当我按下键盘上的“Delete”按钮时,程序会收到三个事件-按键按下,按键键入,以及按键释放。问题是,在按下键和释放键时,设置了参数“keyCode”,但在键入的键中没有设置(事实上,在该事件中没有有意义的信息)。使用F5键,它甚至更有趣-键被按下和键被释放都被注册,但是键被键入从未出现过 监听器是通过Toolkit.getDefaultToolkit().addAWTEventListener()添加的。使用jdk6.26 我有什么问题 编辑: 以下是按下Delete键时发生的事件: jav

当我按下键盘上的
“Delete”
按钮时,程序会收到三个事件-
按键按下
按键键入
,以及
按键释放
。问题是,在按下
键和释放
键时,设置了参数
“keyCode”
,但在键入的
键中没有设置(事实上,在该事件中没有有意义的信息)。使用
F5
键,它甚至更有趣-
键被按下
键被释放
都被注册,但是
键被键入
从未出现过

监听器是通过
Toolkit.getDefaultToolkit().addAWTEventListener()
添加的。使用jdk6.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]
  • 最好是工具

  • 键盘的一部分是内置JComponent功能的保留键,@camickrs提供了更多信息

  • 取决于您需要Implements KeyListener的原因,因为各种JComponent都有许多其他侦听器,它们应该在其中过滤或注册文本更改

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

来自
的“按键类型”事件。此事件在输入字符时生成。在最简单的情况下,它是由一次按键产生的。但是,字符通常是由一系列按键产生的,按键事件到按键类型事件的映射可能是多对一或多对多。


您正在尝试获取F5密钥,该密钥可能未注册为正在输入的字符。通过使用已发布的密钥,您将始终获得所需的结果,并且API的行为符合预期。

密钥类型的事件始终生成“0”作为密钥代码。改为查找方法getKeyChar(),或者(正如建议的那样)改为侦听keyReleased()。
getKeyChar():

这里有什么问题?你检查过这是否是正常行为吗?如果是这样的话,你能不能让一个If语句忽略事件,如果它等于键入的键,如果它没有你需要的信息呢?@Mike-我的问题是我真的需要知道,当用户在键盘上键入Del或F5时。你不能从按下的键代码中获取信息吗?常见问题:a)你为什么需要键盘监听器b)你为什么需要全局锤子?(两者都与键绑定相反)全局快捷键听起来像是键绑定的用例:)在键绑定的“聚焦”窗口中的“\u+1”中注册根窗格的inputMap类型。对于这样的需求,您很少需要使用KeyListener。