JavaFX:如何绑定文本字段"样式属性"文本属性匹配某些模式

时间:2017-04-29 09:21:25

标签: java user-interface javafx fxml

在我的应用程序中,我有一个屏幕,其中包含三个需要验证的字段和一个“保存”按钮。

我绑定保存按钮"禁用属性"到田野' "文字属性"匹配某些模式(本例中的简化模式,并不重要):

public void initialize(){
    saveNetworkBtn.disableProperty()
            .bind(textPropertyBindingPattern(ipInp, Pattern.compile("[0-9]{3}"))
                    .or(textPropertyBindingPattern(subnetInp, Pattern.compile("[0-9]{3}")))
                    .or(textPropertyBindingPattern(gatewayInp, Pattern.compile("[0-9]{3}"))));
}

private BooleanBinding textPropertyBindingPattern(TextField textField, Pattern pattern ) {
    return Bindings.createBooleanBinding(() ->
            !pattern.matcher(textField.getText()).matches(), textField.textProperty());
}

这样保存按钮就会被锁定,直到所有值都正确为止:enter image description here

但我需要使用一些红色边框(如

)突出显示不正确的字段
-fx-border-color: red;

enter image description here

我的主要目标是在一个地方处理这个问题而不是添加几个监听器。 是否有可能在上面的代码中以某种方式对此进行修改或者我需要为每个字段添加侦听器?

1 个答案:

答案 0 :(得分:0)

通过向绑定添加侦听器来解决,这会将样式添加到接收的文本字段:

private BooleanBinding textPropertyBindingPattern(TextField textField, Pattern pattern) {
    BooleanBinding binding = Bindings.createBooleanBinding(() ->
            !pattern.matcher(textField.getText()).matches(), textField.textProperty());

    applyValidationClass(textField, binding.get());

    binding.addListener((obs, oldValue, newValue) -> {
        applyValidationClass(textField, newValue);
    });
    return binding ;
}

private void applyValidationClass(TextField textField, boolean isInvalid) {
    textField.pseudoClassStateChanged(PseudoClass.getPseudoClass("incorrect-value"), isInvalid);
}

和'错误值'在CSS文件中描述:

TextField:incorrect-value {
    -fx-border-color: red;
}

可视化:https://www.screencast.com/t/4NKEjjopvaE7