如何对JavaFX ListProperty进行排序

时间:2015-11-27 13:55:05

标签: javafx listproperty

我似乎遇到了ListProperties的问题。 ObservableLists实现标记接口SortableList,允许对它们进行有效排序,仅触发单个事件。 ListProperties没有实现这个界面(他们怎么可能......?)。相反,他们使用List接口的默认实现,引发了很多更改。

我能看到的唯一解决方案是直接在基础sort()上调用List。但这与返回Property本身的方案相冲突:

public ObservableList getSomeList()
{
    return someListProperty();
}

确保ListChangeListener在交换基础List时保持注册状态。

我很乐意得到一些意见,也许我错过了什么?

1 个答案:

答案 0 :(得分:1)

我猜您引用的SortableListFXCollections.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);
        }
    }

}

唯一的问题是SortableList位于com.sun.javafx.collections包内(请参阅It is a bad practice to use Sun's proprietary Java classes?)。

关于您与财产计划的碰撞:没有,如果您按预定方式定义财产,请参阅Using JavaFX Properties and Binding section Understanding Properties

该属性将如下实现:

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;
}

ListProperty必须确保注册的ListChangeListener从包装列表中接收更改事件。

也许您对fxml中使用的 readonly 列表属性感到困惑,但ListProperty不是只读的。

您仍然可以在fxml文件中使用此属性,但是您需要使用ObservableList类型的值:

<!-- imports -->

<ContainingClass xmlns:fx="http://javafx.com/fxml/1">
    <someList>
        <FXCollections fx:factory="observableArrayList">
            <!-- list content goes here -->
        </FXCollections>
    </someList>
</ContainingClass>