鉴于
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没有按预期工作?
答案 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}}之间使用绑定的更清晰的解决方案。
使用disableProperty
和textProperty
BooleanBinding textIsEmpty = Bindings.createBooleanBinding(() -> textField.getText().trim().isEmpty(), textField.textProperty());
button.disableProperty().bind(textIsEmpty);