【问题标题】:How to sort a JavaFX ListProperty如何对 JavaFX ListProperty 进行排序
【发布时间】:2015-11-27 13:55:05
【问题描述】:

我似乎遇到了ListProperties 的问题。 ObservableLists 实现了标记接口SortableList,它允许它们被有效地排序,只触发一个事件。 ListProperties 不实现这个接口(他们怎么会......?)。相反,他们使用List 接口的默认实现,触发了很多更改。

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

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

确保ListChangeListener 在底层List 被交换时保持注册状态。

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

【问题讨论】:

    标签: javafx listproperty


    【解决方案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);
            }
        }
    
    }
    

    唯一的问题是,SortableListcom.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 必须确保向其注册的ListChangeListeners 接收来自包装列表的更改事件。

    也许您对 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>
    

    【讨论】:

    • 感谢您的广泛回答。对我来说,在 getter 中返回 Property 而不是包装的 List 似乎更明智。这样,任何 Listener 都将保持连接状态,您可以规避一堆错误。是的,您可以检查任何属性方法。但是让 getter 的行为取决于是否有 Property 方法似乎是不好的做法。无论如何,ListProperty 在排序时显示不同的行为对我来说似乎是一个实际的错误。它具有相同的接口,表明它作为委托工作(它在 API 文档中没有说明任何内容),但在排序时没有。
    猜你喜欢
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多