我是JavaFx的新手,我正在创建一个用户必须填写某些表单的应用程序,我希望"预先验证"他们有绑定。像这些元素一样的简单东西可以是空的,或者其中一些只能包含数字。以下是我到目前为止的情况:
saveBtn.disableProperty().bind(Bindings.when(
departureHourText.textProperty().isNotEqualTo("")
.and(isNumber(departureHourText.getText())))
.then(false)
.otherwise(true));
这是我的isNumber
方法:
private BooleanProperty isNumber(String string) {
return new SimpleBooleanProperty(string.matches("[0-9]+"));
}
但无论我在TextField中输入什么内容,按钮都会被禁用。
非常感谢任何帮助。
更新
当我评估此表达式时:departureHourText.textProperty().isNotEqualTo("")
结果将是:BooleanBinding [invalid]
答案 0 :(得分:15)
你的表情有点偏。
让我们尝试测试你的逻辑陈述的两个部分:
saveBtn.disableProperty().bind(Bindings.when(
departureHourText.textProperty().isNotEqualTo(""))
.then(false)
.otherwise(true));
以上代码正常运行。当您在文本框中添加字符串时,您将获得一个按钮切换事件。
saveBtn.disableProperty().bind(Bindings.when(
isNumber(departureHourText.getText()))
.then(false)
.otherwise(true));
上面的代码使得按钮始终被卡住为禁用状态。我们来研究一下原因。
让我们在方法isNumber()中添加一个print语句:
private BooleanProperty isNumber(String string) {
System.out.println("This was called");
return new SimpleBooleanProperty(string.matches("[0-9]+"));
}
如果我们看一下当我们开始输入时执行此操作,我们发现它只在我们最初声明绑定时被调用!这是因为你的方法不知道何时被调用,所以绑定只能在最初看到它,因为它是假的,因为字段中没有数字。
我们需要做的是找到一种方法,以便在我们的text属性更新时,它知道改变状态。如果我们以isNotEqualTo()为例,我们发现我们可能想要找到一种方法来以某种方式创建一个新的BooleanBinding。
现在,我找到了一个函数,我从github链接(https://gist.github.com/james-d/9904574)进行了修改。该链接指示我们如何从正则表达式模式创建新的BooleanBinding。
首先,让我们制作一个新模式:
Pattern numbers = Pattern.compile("[0-9]+");
然后创建绑定函数:
BooleanBinding patternTextAreaBinding(TextArea textArea, Pattern pattern) {
BooleanBinding binding = Bindings.createBooleanBinding(() ->
pattern.matcher(textArea.getText()).matches(), textArea.textProperty());
return binding ;
}
因此,我们现在可以做你想做的事! 我们只是为我们的新patternTextAreaBinding(TextArea textArea,Pattern pattern)函数更改你以前的函数,并传入我们的两个值,你要跟踪的textArea和你想要遵循的Pattern(我称之为数字的模式)
saveBtn.disableProperty().bind(Bindings.when(
departureHourText.textProperty().isNotEqualTo("")
.and(patternTextAreaBinding(departureHourText,numbers)))
.then(false)
.otherwise(true));
希望有所帮助!
答案 1 :(得分:0)
我想知道表达式是否可以在没有when
的情况下编写? If (x) then false else true;
似乎是多余的,可以使用not (x)
...
可以选择仅使用.not()
,如下所示:
.bind(departureHourText.textProperty().isNotEqualTo("").and(patternTextAreaBinding(departureHourText,numbers))).not())