如何对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;
}