Как отсортировать JavaFX ListProperty

Кажется, я столкнулся с проблемой ListProperties, ObservableLists реализовать интерфейс маркера SortableList это позволяет эффективно сортировать их, запуская только одно событие. ListProperties не реализуйте этот интерфейс (как они могли...?). Вместо этого они используют реализацию по умолчанию List Интерфейс, выпустив много изменений.

Единственное решение, которое я вижу, это позвонить sort() на основе List непосредственно. Но это сталкивается со схемой возврата Property сам:

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

который гарантирует, что ListChangeListener оставаться зарегистрированным, когда основной List обменяется

Я был бы счастлив получить некоторую информацию, может быть, я что-то пропустил?

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 пакет (см. Это плохая практика использовать проприетарные Java-классы Sun?).

О вашем столкновении со схемой свойств: нет, если вы определите свойство заданным образом, см. Раздел Использование свойств 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 должен обеспечить ListChangeListener Зарегистрированные пользователи получают события изменения из упакованного списка.

Может быть, вы запутались со свойствами списка только для чтения, используемыми в fxml, но ListProperty не только для чтения

Вы все еще можете использовать это свойство в файле fxml, но вам нужно будет использовать значение типа ObservableList:

<!-- imports -->

<ContainingClass xmlns:fx="http://javafx.com/fxml/1">
    <someList>
        <FXCollections fx:factory="observableArrayList">
            <!-- list content goes here -->
        </FXCollections>
    </someList>
</ContainingClass>
Другие вопросы по тегам