【问题标题】:Disable keyboard spacebar key type in JFXTextField [duplicate]在 JFXTextField 中禁用键盘空格键类型 [重复]
【发布时间】:2018-06-22 07:52:24
【问题描述】:

我需要禁用 JFXTextField 中的空间。 我正在使用以下代码:

...
@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();
        }
    });

}

虽然程序检测到空格键被按下,但它在文本字段中输入了一个空格。

有什么建议吗?

【问题讨论】:

    标签: javafx keyboard textfield detection


    【解决方案1】:

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

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

    更多信息请阅读this。

    【讨论】:

    • 仍然无法正常工作 :-(。检测到空格键,但仍在文本字段中输入。
    • @user6127833 见this。
    • 是的!,这就像一个魅力。非常感谢贾!如果您将问题的链接添加为答案,我可以接受它是正确的。
    • 最好将此问题标记为重复。从长远来看,它将帮助更多的人:)
    【解决方案2】:

    您需要在事件过滤器中为空格字符消耗KEY_TYPED 事件,因为这种事件负责修改text 属性:

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

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

    【讨论】:

      【解决方案3】:

      如果检测到空格键,则删除空格:

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

      【讨论】:

      • 是的,这是一个解决方案,但它实际上是在文本字段中输入空格。我想要的是禁用它。
      猜你喜欢
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 2015-11-20
      • 2017-08-15
      • 1970-01-01
      相关资源
      最近更新 更多