如何对JavaFX ListProperty进行排序
似乎我遇到了如何对JavaFX ListProperty进行排序,javafx,listproperty,Javafx,Listproperty,似乎我遇到了ListProperties的问题ObservableList实现标记接口SortableList,该接口允许有效地对它们进行排序,只触发一个事件列表属性不实现此接口(它们怎么可能…?)。相反,他们使用列表接口的默认实现,触发了大量更改 我能看到的唯一解决方案是直接调用底层列表上的sort()。但这与返回属性本身的方案相冲突: public ObservableList getSomeList() { return someListProperty(); } 这可确保在交换
ListProperties
的问题ObservableList
实现标记接口SortableList
,该接口允许有效地对它们进行排序,只触发一个事件<代码>列表属性不实现此接口(它们怎么可能…?)。相反,他们使用列表
接口的默认实现,触发了大量更改
我能看到的唯一解决方案是直接调用底层列表上的sort()
。但这与返回属性本身的方案相冲突:
public ObservableList getSomeList()
{
return someListProperty();
}
这可确保在交换基础列表
时,ListChangeListener
保持注册状态
我很乐意得到一些输入,也许我遗漏了什么?我想你提到的SortableList
就是在FXCollections.sort
中使用的
ListProperty
可以实现SortableList
接口
这可能确实是一个好主意,因为如果在属性上使用了FXCollections.sort
,这将允许您选择包装列表的排序方式。在本例中,您可以对包含的列表使用FXCollections.sort
他们怎么可能?像这样:
class MyListProperty<T> extends ListPropertyBase<T> implements SortableList<T> {
...
@Override
public void sort() {
ObservableList<T> list = getValue();
if (list != null) {
FXCollections.sort((ObservableList<Comparable>) list);
}
}
@Override
public void sort(Comparator<? super T> comparator) {
ObservableList<T> list = getValue();
if (list != null) {
FXCollections.sort(list, comparator);
}
}
}
ListProperty
必须确保注册到它的ListChangeListener
s从包装列表接收更改事件
可能您对fxml中使用的readonly列表属性感到困惑,但是ListProperty
不是只读的
您仍然可以在fxml文件中使用此属性,但需要使用类型为ObservableList
的值:
感谢您的详尽回答。对我来说,在getter中返回属性而不是包装的列表似乎更明智。这样,任何侦听器都将保持连接,您可以避免一系列错误。是的,您可以检查任何属性方法。但让getter的行为取决于是否存在属性方法似乎是一种糟糕的做法。无论如何,当排序对我来说似乎是一个真正的bug时,ListProperty显示了一种不同的行为。它具有相同的接口,指示它作为委托工作(它在API文档中没有说明任何内容),但在排序时不这样做。
private final ListProperty<MyClass> someList = ...;
public ObservableList<MyClass> getSomeList() {
return someList.get();
}
public void setSomeList(ObservableList<MyClass> newList) {
someList.set(newList);
}
public ListProperty<MyClass> someListProperty() {
return someList;
}