我正在 JavaFX 中做一个项目,使用 Java 8 和 Gluon scenebuilder。我想检测何时在
backspace
内按下 TextField
。这是我正在使用的代码:
public void keyPressed(KeyEvent kEvent) {
if (kEvent.getCode() == KeyCode.BACK_SPACE) {
System.out.println("Backspace pressed");
}
此代码位于名为
FXMLDocumentController
的控制器文件内,它控制 GUI xml 文件 FXMLDocument
。从下图中您可以看到,每当在 TextField
内键入按键时就会调用该函数。这适用于所有字母/数字,但不适用于 backspace
。
理论上应该可以,但事实并非如此。
如何管理
backspace
按钮的输入?
编辑:
请注意,将这个确切的函数放在元素的根部、“窗口本身”(即
AnchorPane
)上是有效的。问题在于读取 backspace
内的 TextField
的按压。您可以在下图中看到我放置该函数的位置:
您应该在
keyPressed
或 on key pressed
中使用 on key released
方法。
在Docs中,它指出:
对于不生成 Unicode 的按键,不会生成按键类型事件 字符(例如操作键、修饰键等)。
Backspace 被视为
Action Key
。
在 SceneBuilder 的屏幕截图中,我可以看到您正在使用
On KeyTyped 引用
keyPressed(KeyEvent kEvent)
控制器方法,而不是 On Key Pressed。
对于
KeyEvent.KEY_TYPED
的事件,getCode()
的值始终为 KeyCode.UNDEFINED
。
编辑:我回到这个答案并重新阅读你的问题。我想澄清一些事情,但我上面说的仍然是正确的。
在您的编辑中,您提到“完全相同”的设置适用于
AnchorPane
,但在查看屏幕截图时存在一些差异。对于您的 AnchorPane
,您可以参考所有三种类型的控制器方法:按下按键、释放按键和键入按键。
这意味着每次击键最多应调用该方法 3 次(当事件到达
AnchorPane
时)。按下一次,键入一次(如果该键能够发送键入的事件 - 请参阅 Sedrick 的answer 进行说明),然后释放一次。因此,该方法will适用于pressed和released事件,但它won't适用于typed事件。
换句话说,您的代码适用于
AnchorPane
但不适用于 TextField
的原因是因为您正确配置了 AnchorPane
而不是 TextField
。