低级绑定disableProperty和控制器的setDisable

时间:2016-09-09 15:47:06

标签: java javafx javafx-8

有没有办法做一个低级别的绑定,但也能够setDisable(ture/false)到控制器?

例如:

    HBoxSomeBox.disableProperty().bind(new BooleanBinding() { 
        {
            bind(someIntValue);
        }

        @Override
        protected boolean computeValue() {
            return someIntValue >=2 ;
        }
    });

代码中的其他地方HBoxSomeBox.setDisable(false)

目前,当我尝试这样做时会引发异常:

  

java.lang.RuntimeException:HBox.disable:无法设置绑定值。

那么有另一种方法可以设置绑定控制器,还能设置它吗?

1 个答案:

答案 0 :(得分:4)

从评论中,您似乎希望在someIntValue的值至少为2时或在“由视图指示”的其他情况下禁用您的控件。您可以创建表示其他情况的BooleanProperty,并在绑定中使用它:

IntegerProperty someIntProperty = ... ;

BooleanProperty forceDisable = new SimpleBooleanProperty();

hboxSomeHBox.disableProperty().bind(new BooleanBinding() {
    {
        bind(someIntValue, forceDisable);
    }

    @Override
    public boolean computeValue() {
        return someIntValue.get() >= 2 || forceDisable.get() ;
    }
}

或者,更简洁,

BooleanProperty forceDisable = new SimpleBooleanProperty();

hboxSomeHBox.disableProperty().bind(someIntValue.greaterThanOrEqualTo(2).or(forceDisable));

然后调用forceDisable.set(true);将禁用该控件。

您也可以通过听众简单地实现这一目标:

someIntValue.addListener((obs, oldValue, newValue) -> {
    if (newValue.intValue() >= 2) {
        hboxSomeHBox.setDisable(true);
    }
});

由于未绑定属性,您可以通常的方式设置它。