JavaFX将选择框绑定到集合中的属性

时间:2016-08-05 08:57:30

标签: java javafx

使用JavaFX,将ChoiceBox绑定到集合属性的最佳方法是什么? 在下面的示例中,我尝试将ChoiceBox元素绑定到name ObservableList的{​​{1}}。添加/删除项目时,此功能正常,但在属性值beans更改时则无效。

我希望有一个干净而简单的解决方案,但尚未找到任何一个例子...

故意未使用属性实现类name,因为该对象可能对应于我无法控制的外部模型类。

ExampleBean2

1 个答案:

答案 0 :(得分:2)

下面

ObservableList<BeanExample2> names = FXCollections.observableArrayList(new Callback<BeanExample2, Observable[]>() {
    @Override
    public Observable[] call(BeanExample2 param) {
        return new Observable[]{new SimpleStringProperty(param, "name")};
    }
});

您正在创建一个新属性来侦听除call方法返回的值之外无法引用的更新。 BeanExample2实例与SimpleStringProperty之间的唯一关系是BeanExample2实例用作属性的bean,除了通过getBean()方法可用之外没有任何影响的财产。永远不会分配属性的值,更改为BeanExample2实例的更改。

要正确触发ObservableList中的更新,您需要确保上述方法返回的数组中的元素实际上已通知更新。通常将属性添加到类本身:

public static class BeanExample2 {

    public final String getName() {
        return this.name.get();
    }

    private final StringProperty name = new SimpleStringProperty();

    public final void setName(String value) {
        this.name.set(value);
    }

    @Override
    public String toString() {
        return "BeanExample2{"
                + "name='" + name.get() + '\''
                + '}';
    }

    public final StringProperty nameProperty() {
        return this.name;
    }
}

返回一个包含Callback

属性的数组
ObservableList<BeanExample2> names = FXCollections.observableArrayList(new Callback<BeanExample2, Observable[]>() {
    @Override
    public Observable[] call(BeanExample2 param) {
        return new Observable[]{param.nameProperty()};
    }
});

请注意,目前ChoiceBox中似乎存在一个错误,它将每个中间值的条目添加到ChoiceBox

ComboBox没有此问题,可以代替ChoiceBox使用。