条件绑定

时间:2015-07-22 20:00:16

标签: java javafx javafx-8

我是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]

2 个答案:

答案 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())