Как отсортировать 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>