Javafx组合框按排序顺序列出内容

Javafx组合框按排序顺序列出内容,javafx,javafx-8,Javafx,Javafx 8,我正在尝试用一个组合框按排序列出内容。我提出了一个解决方案,但仍然存在一些问题 final ObservableList<String> oal = FXCollections.observableArrayList(); final SimpleListProperty<String> slp = new SimpleListProperty<String>(oal); final SortedList<String> sl = new Sor

我正在尝试用一个组合框按排序列出内容。我提出了一个解决方案,但仍然存在一些问题

final ObservableList<String> oal = FXCollections.observableArrayList();
final SimpleListProperty<String> slp =  new SimpleListProperty<String>(oal);
final SortedList<String> sl = new SortedList<String>(slp, (string1, string2) -> {
    return string1.compareTo(string2);
});

final ComboBox<String> comboBox = new ComboBox<String>();
comboBox.setItems(sl);
但如果我尝试向SL添加值,它就会失败

sl.addAll("iiii", "hhhh", "gggg");

Exception in thread "main" java.lang.UnsupportedOperationException
当然,任何向comboBox添加值的尝试都会失败。是否有人知道解决这个问题的方法,或者是否有一种完全不同的方法来排序组合框的内容

我很感激这里的任何帮助


我使用的是Java 8u5。

您不能将项目添加到基础列表而不是排序列表吗

final ObservableList<String> comboBoxItems = FXCollections.observableArrayList();
final ComboBox<String> comboBox = new ComboBox<String>();
comboBox.setItems(new SortedList<String>(comboBoxItems, Collator.getInstance()));
final ObservableList comboBoxItems=FXCollections.observableArrayList();
最终组合框ComboBox=新组合框();
setItems(新的SortedList(comboBoxItems,Collator.getInstance());

然后总是将项目添加到
comboBoxItems

难道不能将项目添加到基础列表而不是排序列表吗

final ObservableList<String> comboBoxItems = FXCollections.observableArrayList();
final ComboBox<String> comboBox = new ComboBox<String>();
comboBox.setItems(new SortedList<String>(comboBoxItems, Collator.getInstance()));
final ObservableList comboBoxItems=FXCollections.observableArrayList();
最终组合框ComboBox=新组合框();
setItems(新的SortedList(comboBoxItems,Collator.getInstance());

然后总是将项目添加到
comboBoxItems

我添加这个作为回答,因为我没有足够的stackoverflow声誉来评论。
请注意,当前(Java 8u92和以前的版本)存在一个bug,当使用SortedList而不是ObservableList向可编辑组合框添加项目时,会触发额外的不需要的组合框OnAction事件。这个bug使得很难为combobox事件正确编码,因此我建议在修复bug之前不要使用SortedList。另请参见此问题。

我添加此作为回答,因为我没有足够的stackoverflow声誉发表评论。
请注意,当前(Java 8u92和以前的版本)存在一个bug,当使用SortedList而不是ObservableList向可编辑组合框添加项目时,会触发额外的不需要的组合框OnAction事件。这个bug使得很难为combobox事件正确编码,因此我建议在修复bug之前不要使用SortedList。另请参见此问题。

咳嗽(您可能知道,只是因为他/她超载而重复OPs错误:-)。。。在UI中不应该使用字符串的compareTo,而应该使用collator,always.cool,+1:-)并为我的最后一条评论购买一个“not”(在“重载”之前使用)。我非常喜欢collator.getInstance()比定义自己的比较器更好。正如我前面提到的,我可以向ObservableList添加值,但不能向ComboBox添加值。我可以学会适应这种情况,但这意味着我需要更多地访问ObservableList,而不仅仅是ComboBox。我正在尝试对ComboBox进行子类化并重写
itemsProperty()
尝试并实现此功能,以便您可以执行
comboBox.getItems().add(…)
,但它实际上不是设计成这样子类的。因为无论如何都不应该让对UI组件的引用泄漏到控制器之外,所以强制执行只添加到基础列表的规则应该没什么大不了的。@TimFletcher filteredList被设计成不可变和不可修改的(减轻了框架任务并给应用程序开发人员带来了负担——这是一个不幸的设计决策,IMO,因为像GlazedList这样的实现没有这样的限制)-你可以访问combo的列表,将其键入filteredList,访问源代码列表并将其添加到那里。但是,讨厌的代码…咳嗽(你可能知道它,只是因为重载了他/她:-)而重复OPs错误…你不应该在UI中使用字符串的compareTo,而应该使用collator,always.cool,+1:-)并购买“not”作为我最后的评论(在“重载”之前使用)。我非常喜欢Collator.getInstance()比定义自己的比较器更好。正如我前面提到的,我可以向ObservableList添加值,但不能向ComboBox添加值。我可以学会适应这种情况,但这意味着我需要更多地访问ObservableList,而不仅仅是ComboBox。我正在尝试对ComboBox进行子类化并重写
itemsProperty()
尝试并实现此功能,以便您可以执行
comboBox.getItems().add(…)
,但它实际上不是设计成这样子类的。因为无论如何都不应该让对UI组件的引用泄漏到控制器之外,所以强制执行只添加到基础列表的规则应该没什么大不了的。@TimFletcher filteredList被设计成不可变和不可修改的(减轻了框架任务并给应用程序开发人员带来了负担——这是一个不幸的设计决策,IMO,因为像GlazedList这样的实现没有这样的限制)-你可以访问combo的列表,将其类型转换到filteredList,访问源列表并将其添加到那里。但是,讨厌的代码。。。