2

看来我遇到了问题ListPropertiesObservableLists实现标记接口SortableList,使它们能够被有效地排序,只触发一个事件。ListProperties不要实现这个接口(他们怎么可能......?)。相反,他们使用List接口的默认实现,触发大量更改。

我能看到的唯一解决方案是直接调用sort()底层证券List。但这与返回Property自身的方案相冲突:

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

这确保了在交换ListChangeListener底层证券时保持注册状态List

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

4

1 回答 1

1

我猜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);
        }
    }

}

唯一的问题是,这SortableList是在com.sun.javafx.collections包内部(请参阅使用 Sun 的专有 Java 类是一种不好的做法?)。

关于您与属性方案的冲突:没有,如果您以预期的方式定义属性,请参阅使用 JavaFX 属性和绑定部分了解属性

该属性将像这样实现:

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必须确保向其注册的sListChangeListener接收来自包装列表的更改事件。

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

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

<!-- imports -->

<ContainingClass xmlns:fx="http://javafx.com/fxml/1">
    <someList>
        <FXCollections fx:factory="observableArrayList">
            <!-- list content goes here -->
        </FXCollections>
    </someList>
</ContainingClass>
于 2015-11-27T17:19:09.043 回答