JavaFx 中 BACKSPACE 的按键代码事件

问题描述 投票:0回答:2

我正在 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

Gluon scene builder settings

理论上应该可以,但事实并非如此。

如何管理

backspace
按钮的输入?

编辑:

请注意,将这个确切的函数放在元素的根部、“窗口本身”(即

AnchorPane
)上是有效的。问题在于读取
backspace
内的
TextField
的按压。您可以在下图中看到我放置该函数的位置:

On the window backspace's detecting works

java javafx java-8 gluon
2个回答
3
投票

您应该在

keyPressed
on key pressed
中使用
on key released
方法。

Docs中,它指出:

对于不生成 Unicode 的按键,不会生成按键类型事件 字符(例如操作键、修饰键等)。

Backspace 被视为

Action Key


3
投票

在 SceneBuilder 的屏幕截图中,我可以看到您正在使用

On Key 
Typed 引用 keyPressed(KeyEvent kEvent) 控制器方法,而不是 On Key Pressed

对于

KeyEvent.KEY_TYPED
的事件,
getCode()
的值始终为
KeyCode.UNDEFINED


编辑:我回到这个答案并重新阅读你的问题。我想澄清一些事情,但我上面说的仍然是正确的。

在您的编辑中,您提到“完全相同”的设置适用于

AnchorPane
,但在查看屏幕截图时存在一些差异。对于您的
AnchorPane
,您可以参考所有三种类型的控制器方法:按下按键、释放按键和键入按键。

这意味着每次击键最多应调用该方法 3 次(当事件到达

AnchorPane
时)。按下一次,键入一次(如果该键能够发送键入的事件 - 请参阅 Sedrick 的answer 进行说明),然后释放一次。因此,该方法will适用于pressedreleased事件,但它won't适用于typed事件。

换句话说,您的代码适用于

AnchorPane
但不适用于
TextField
的原因是因为您正确配置了
AnchorPane
而不是
TextField

© www.soinside.com 2019 - 2024. All rights reserved.