使用JavaFX,将ChoiceBox
绑定到集合属性的最佳方法是什么?
在下面的示例中,我尝试将ChoiceBox
元素绑定到name
ObservableList
的{{1}}。添加/删除项目时,此功能正常,但在属性值beans
更改时则无效。
我希望有一个干净而简单的解决方案,但尚未找到任何一个例子...
故意未使用属性实现类name
,因为该对象可能对应于我无法控制的外部模型类。
ExampleBean2
答案 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
使用。