Java 控制器的disableProperty和setDisable的低级绑定
是否有一种方法可以对控制器执行低级别绑定,但仍然可以执行SetDisableTrue/false 例如: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
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是一个数据成员,为了其他原因更改该布尔值,但它似乎不起作用@詹姆斯·杜德