JDK8计算器项目keyPressed方法触发后屏幕出现多余字符问题求解
问题原因
你遇到的异常是Swing组件的默认按键处理逻辑和自定义逻辑叠加导致的,具体原因有两点:
- 你将
KeyListener绑定到了JTextField类型的Screen组件上,该组件本身内置了默认的输入逻辑:按下可打印字符时会自动将字符追加到文本框内容中。你按下B键时,自定义逻辑先追加了数字2,随后组件默认逻辑又追加了字符b,最终就得到了「2b」的内容。 - 你在方法开头调用了
super.keyPressed(e),且处理完自定义逻辑后没有消费按键事件,事件会继续向下传递触发组件的默认输入逻辑。
解决方案
提供两种可直接落地的修改方式,选择任意一种即可:
方式一:修改现有KeyListener实现
调整执行顺序,自定义按键处理完成后消费事件,阻止默认逻辑触发:
public void keyPressed ( KeyEvent e ) { int key = e.getKeyCode() ; if ( key == KeyEvent.VK_B ) { String buttonTwoText = Screen.getText() + buttonTwo.getText() ; Screen.setText(buttonTwoText); // 消费当前按键事件,终止事件传递,不会再触发JTextField的默认输入 e.consume(); return; } // 非自定义处理的按键再走父类默认逻辑 super.keyPressed(e); }
方式二:调整监听器绑定对象
把全局按键监听器绑定到计算器的顶层JFrame窗口上,不要绑定到Screen文本框组件,这样按键事件不会直接被文本框捕获触发默认输入,从根源避免字符重复追加的问题。
内容的提问来源于stack exchange,提问作者user16610334
相关产品推荐
相关产品推荐

