java - 条件绑定(bind)

标签 java javafx javafx-8

我是 JavaFx 的新手,我正在创建一个应用程序,用户必须在其中填写一些表格,我想用绑定(bind)“预验证”它们。简单的东西,比如所有元素都不能为空,或者其中一些只能包含数字。这是我到目前为止所拥有的:

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]

最佳答案

你的表情有点不对。

让我们尝试测试逻辑语句的两个部分:

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() 方法中添加一个打印语句:

private BooleanProperty isNumber(String string) {
System.out.println("This was called");
return new SimpleBooleanProperty(string.matches("[0-9]+"));
}

如果我们在开始输入时查看它何时执行,我们会发现它仅在我们最初声明绑定(bind)时被调用!这是因为您的方法不知道何时被调用,所以绑定(bind)只会在最初看到它,当它为 false 时,因为该字段中没有数字。

我们需要做的是找到一种方法,以便当我们的文本属性更新时,它知道改变状态。如果我们以 isNotEqualTo() 为例,我们会发现我们可能想要寻找一种方法来以某种方式创建新的 BooleanBinding。

现在,我找到了一个函数,并从 github 链接 (https://gist.github.com/james-d/9904574) 进行了修改。该链接指示我们如何从正则表达式模式创建新的 BooleanBinding。

首先,让我们制作一个新图案:

Pattern numbers = Pattern.compile("[0-9]+");

然后创建绑定(bind)函数:

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 和您要遵循的模式(我将模式称为上面的数字) .

saveBtn.disableProperty().bind(Bindings.when(
        departureHourText.textProperty().isNotEqualTo("")
                .and(patternTextAreaBinding(departureHourText,numbers)))
        .then(false)
        .otherwise(true));

希望对您有所帮助!

关于java - 条件绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31572889/

相关文章:

java - "Unresolved compilation problem"是什么意思?

Java:动态加载同一个类的多个版本

javafx-8 - 生成一个表格 View ,其中包含包含复选框的列,并将列表器添加到这些复选框

javafx - JavaFX 和 Vaadin 的区别

java - 如何将 ListView 的内容变成 ArrayList?

java - 如何将 JavaFX Canvas 嵌入到 BorderPane 中?

java - 将 JSON 文件读入集合,最佳实践

java - JList 在自动滚动和自动选择时变坏(GUI 问题)

java - 如何在for循环中停止handler.postDelayed?

JavaFX 线程卡住