你的表情有点不对劲。
让我们尝试测试逻辑语句的两个部分:
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]+"));
}
如果我们在开始输入时查看何时执行它,我们会发现它仅在我们最初声明绑定时被调用!这是因为您的方法不知道何时被调用,因此绑定只能在最初看到它,此时它是 false,因为字段中没有数字。
我们需要做的是找到一种方法,以便当我们的文本属性更新时,它知道改变状态。如果我们以 isNotEqualTo() 为例,我们会发现我们可能想要寻找一种方法来以某种方式创建新的 BooleanBinding。
现在,我找到了一个函数,并从 github 链接进行了修改(https://gist.github.com/james-d/9904574 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));
希望有帮助!