我似乎遇到了ListProperties
的问题。 ObservableLists
实现标记接口SortableList
,允许对它们进行有效排序,仅触发单个事件。 ListProperties
没有实现这个界面(他们怎么可能......?)。相反,他们使用List
接口的默认实现,引发了很多更改。
我能看到的唯一解决方案是直接在基础sort()
上调用List
。但这与返回Property
本身的方案相冲突:
public ObservableList getSomeList()
{
return someListProperty();
}
确保ListChangeListener
在交换基础List
时保持注册状态。
我很乐意得到一些意见,也许我错过了什么?
答案 0 :(得分: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
包内(请参阅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>