我有一个comboBox cb
和一个ObservableList<StringProperty> data
我将cb
的Items
绑定到data
,如下所示:
Bindings.bindContent(cb.getItems(), data);
假设
data
具有以下各项:str1, str2, str3, str4
当我更改
data
时,组合框将毫无问题地获取新列表。但是,如果在
str3
中选择了cb
,并且我在数据中将str3
的值更改为NewStr3
,则该更改不会显示在cb中。有时显示的列表也是错误的(它显示的是str3而不是NewStr3),尽管它所引用的基础数据是正确的。更改基础模型时,如何强制组合框显示新值?
最佳答案
组合框中的所选项目不需要成为组合框的项目列表的元素。 (例如,在一个可编辑的组合框中,您可以键入不在列表中的项目。)如果您从这个角度考虑示例,它的行为就像您描述的那样就不足为奇了。
如果要在该列表可能更改时强制将选定值作为基础列表的元素,则需要定义如果列表更改为不再包含所选项目的方式,则所选项目应如何更改如何执行此操作并不明显,并且可能取决于您的应用程序逻辑)。知道要执行的操作后,可以使用ListChangeListener
实施它:
cb.getItems().addListener((ListChangeListener.Change change) -> {
String newSelectedItem = ... ; // figure item that should be selected instead
cb.setValue(newSelectedItem);
});
最简单的实现就是
cb.setValue(null);
,这意味着如果列表更改,则不再选择任何项目,从而不再包含当前选择的项目。