在 JFXTextField 中禁用键盘空格键类型

Disable keyboard spacebar key type in JFXTextField

我需要在 JFXTextField 中禁用 space。 我使用以下代码:

...
@FXML
private JFXTextField valueTextField;

valueTextField.setKeyListenerForSpace();

private void setKeyListenerForSpace(){

    valueTextField.setOnKeyPressed( (event) -> {
        if (event.getCode() == KeyCode.SPACE) {
            System.out.println("Spacebar key detected!");
            event.consume();
        }
    });

}

虽然程序检测到 spacebar 键被按下,但它正在文本字段中键入 space。

有什么建议吗?

setOnKeyPressed() 是一个事件处理程序 setter;你需要一个事件过滤器,它会在事件捕获阶段拦截这个按键事件,防止这个控件在事件冒泡阶段接收到这个事件。

valueTextField.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
    if (event.getCode() == KeyCode.SPACE) {
        System.out.println("Spacebar key detected!");
        event.consume();
    }
});

有关详细信息,请阅读 this

您需要在事件过滤器中为 space 字符使用 KEY_TYPED 事件,因为此类事件负责修改 text 属性:

valueTextField.addEventFilter(KeyEvent.KEY_TYPED, evt -> {
    if (" ".equals(evt.getCharacter())) {
        System.out.println("space typed");
        evt.consume();
    }
});

valueTextField.setKeyListenerForSpace(); 不过应该会产生编译时错误。

如果检测到 space 键,删除 space:

valueTextField.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
        if (event.getCode() == KeyCode.SPACE) {
            valueTextField.setText(valueTextField.getText().substring(0, valueTextField.getLength()-1));
        }
});