JavaFX TextField OnKeyTyped无法正常工作

时间:2016-06-16 08:19:39

标签: java javafx properties listener textfield

鉴于

JavaFX App,输入TextField并提交Button

EventHandler附加TextField,因此如果没有输入文字,则应禁用Button,反之亦然。

这是我的代码:

button.setDisable(true); // initially disabled
textField.setOnKeyTyped(new EventHandler<KeyEvent>() {
       @Override
       public void handle(KeyEvent event) {
            if (textField.getText().trim().isEmpty()) { // if blank textfield
                 button.setDisable(true);
            } else {
                 button.setDisable(false); 
             }
        }
});

两个控件都已正确初始化。据我所知,KeyTyped和KeyPressed / Released之间的区别在于Typed适用于实际可以输入和显示的字符;而Pressed / Released适用于任何键盘键,包括Ctrl,Alt ...

问题

我输入textField一个字符,button仍然被禁用!如果我键入2个字符以上,则会启用它!

但是,如果我执行以下操作:

button.setDisable(true);
textField.setOnKeyReleased(
    /*
     exact same code as above
    */
);

我的问题将得到解决。

问题

为什么?我的代码中的缺陷在哪里?为什么KeyTyped没有按预期工作?

1 个答案:

答案 0 :(得分:3)

问题是:在您处理KeyEvent时,您不确定TextField的{​​{3}}是否已更新。

textProperty TextField的{​​{1}}添加一个更清晰,更安全的方法,以便在TextField的文字发生变化时收到通知。想象一下用户粘贴了一些内容的用例:在这种情况下,根本没有KeyEvent,因此您的Button仍然处于停用状态。

在textProperty()上使用侦听器

button.setDisable(true);
textField.textProperty().addListener((obj, oldVal, newVal) -> {

    if (newVal.trim().isEmpty()) { // if blank textfield
         button.setDisable(true);
    } else {
         button.setDisable(false); 
     }
});

......甚至更短......

button.setDisable(true);
textField.textProperty().addListener((obj, oldVal, newVal) -> button.setDisable(newVal.trim().isEmpty()));

但是,在Button的{​​{3}}和TextField的{​​{3}}之间使用绑定的更清晰的解决方案。

使用disablePropertytextProperty

之间的绑定
BooleanBinding textIsEmpty = Bindings.createBooleanBinding(() -> textField.getText().trim().isEmpty(), textField.textProperty());
button.disableProperty().bind(textIsEmpty);