创建与List / ObstableList值绑定的BooleanBinding

时间:2018-10-23 12:40:58

标签: javafx binding observable

我正在尝试创建与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

1 个答案:

答案 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 }); 被添加到列表本身,而不是列表的内容。