我有一个comboBox cb和一个ObservableList<StringProperty> data
我将cbItems绑定到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);,这意味着如果列表更改,则不再选择任何项目,从而不再包含当前选择的项目。

10-08 02:06