Java 控制器的disableProperty和setDisable的低级绑定

Java 控制器的disableProperty和setDisable的低级绑定,java,javafx,javafx-8,Java,Javafx,Javafx 8,是否有一种方法可以对控制器执行低级别绑定,但仍然可以执行SetDisableTrue/false 例如: HBoxSomeBox.disableProperty().bind(new BooleanBinding() { { bind(someIntValue); } @Override protected boolean computeValue() { return s

是否有一种方法可以对控制器执行低级别绑定,但仍然可以执行SetDisableTrue/false

例如:

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

        @Override
        protected boolean computeValue() {
            return someIntValue >=2 ;
        }
    });
在代码中的其他地方执行hboxomebox.setDisablefalse

目前,当我尝试这样做时,它会抛出一个异常:

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


那么,有没有其他方法可以拥有绑定控制器,但也可以设置它呢?

从注释中可以看出,只要someIntValue的值至少为两个,或者在视图指定的其他情况下,您似乎想要禁用控件。您可以创建表示这些其他情况的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.settrue;将禁用该控件

您也可以通过侦听器实现这一点:

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

由于disable属性未绑定,您可以按常规方式自由设置它。

绑定值意味着保持值与此值相同。在这种情况下,设置值没有意义。你能描述一下绑定对属性的影响吗?这对我来说似乎是一个XY问题。我想将该控制器绑定到某个特定值,该值将根据该值禁用该控制器,但禁用该控制器可能还有其他原因@fabian@kuhaku你在自相矛盾。绑定意味着HBoxSomeBox.disableProperty的值始终与您将其绑定到的值相同。因此,如果您希望能够出于其他原因更改它,那么根据定义,您不希望绑定它。那么你的真正意思是什么呢?基本上是在满足某些条件时自动禁用它,someIntValue来自模型,其他原因与视图有关。我只是想到了一件事,改为:返回someIntValue>=2 | | someBoolean;,someBoolean是一个数据成员,为了其他原因更改该布尔值,但它似乎不起作用@詹姆斯·杜德