我正在尝试创建与BooleanBinding
绑定的Button#disableProperty()
。我的目的是在从动态创建的面板列表中更改TextField
时启用/禁用“确定”按钮。
这是面板列表(propertiesList)的初始化
<DialogPane prefWidth="900" prefHeight="600" xmlns="http://javafx.com/javafx/8.0.172-ea" xmlns:fx="http://javafx.com/fxml/1">
<fx:define>
<FXCollections fx:id="propertiesList" fx:factory="observableArrayList">
<DatabasePane name="База данни"/>
<DatabasePane name="База данни 2"/>
</FXCollections>
</fx:define>
....
<buttonTypes>
<ButtonType fx:id="okButtonType" buttonData="OK_DONE" text="Готово" />
<ButtonType buttonData="CANCEL_CLOSE" text="Затвори" />
</buttonTypes>
</DialogPane>
每个DatabasePane
包含名为BooleanProperty
的{{1}}以及相应的getter和setter。
在控制器中,我根据change
中添加的面板的属性创建BooleanProperty
集合
propertiesList
List<BooleanProperty> list = propertiesList.stream()
.map(pane -> pane.changeProperty())
.collect(Collectors.toList());
BooleanBinding change = Bindings.createBooleanBinding(() -> true, (BooleanProperty[]) list.toArray());
Button button = (Button) dialogPane.lookupButton(okButtonType);
button.disableProperty().bind(change.not());
如果我使用java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [Ljavafx.beans.property.BooleanProperty; ([Ljava.lang.Object; is in module java.base of loader 'bootstrap'; [Ljavafx.beans.property.BooleanProperty; is in module javafx.base of loader 'app')
则没有错误,但仅对列表本身进行了更改
ObservableList
答案 0 :(得分:2)
TestBed.overrideProvider(MyService, { useValue: MyServiceMock });
返回一个List.toArray()
数组而不是一个Object[]
数组,但是您在这里将对象数组强制转换为BooleanProperty[]
:
BooleanProperty
我建议使用Stream
's toArray
method taking a IntFunction
:
(BooleanProperty[]) list.toArray()
除非您将Observable[] dependencies = propertiesList.stream()
.map(DatabasePane::changeProperty)
.toArray(Observable[]::new);
BooleanBinding change = Bindings.createBooleanBinding(() -> true, dependencies);
更改为更有意义的内容,否则也可以忽略依赖项,因为绑定从不包含值,而是Callable<Boolean>
。
true
不起作用,因为列表本身实现了BooleanBinding change = Bindings.createBooleanBinding(() -> true, list);
,所以您要将仅包含列表的数组传递给varargs参数,即等效于
Observable
,唯一添加的BooleanBinding change = Bindings.createBooleanBinding(() -> true, new Observable []{ list });
被添加到列表本身,而不是列表的内容。