我正在尝试将项目设置为tableview但是setitems方法需要一个observablelist,而我的模型中有一个observableset.FXCollections实用程序类没有给定可观察集创建可观察列表的方法.我尝试了但是这导致了类强制转换异常(如预期的那样).
目前我正在使用这种代码
new ObservableListWrapper<E>(new ArrayList<E>(pojo.getObservableSet()));
我有一些问题:
>在表格中对此进行编辑是否会按预期更新基础集合?
>这是“正确”的做法吗?
所以简而言之,我需要一个样式指南或最佳实践来在可观察集和可观察列表之间进行转换,因为我希望在构建java fx GUI时能够做很多事情
解决方法:
将在表中编辑此更新按预期更新基础集?
不,因为,你正在做集合的副本:
new ArrayList<E>(pojo.getObservableSet()
这是“正确”的做法吗?
我认为正确的方法不是这样做的. Set不是List,反之亦然.两者都有特定的约束力.例如,列表是有序的,而集合不包含重复的元素.
而且,FXCollections
和Bindings
都没有提供这种东西.
我希望将该集合保留为一组以强制执行唯一性
我猜你可以写一个自定义的ObservableList,例如Parent::children
有类似的行为.如果添加了重复的子项,则抛出IllegalArgumentException.如果查看源代码,您将看到它是VetoableListDecorator扩展.你可以写自己的:
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import com.sun.javafx.collections.VetoableListDecorator;
public class CustomObservableList<E> extends VetoableListDecorator<E> {
public CustomObservableList(ObservableList<E> decorated) {
super(decorated);
}
@Override
protected void onProposedChange(List<E> toBeAdded, int... indexes) {
for (E e : toBeAdded) {
if (contains(e)) {
throw new IllegalArgumentException("Duplicament element added");
}
}
}
}
class Test {
public static void main(String[] args) {
Object o1 = new Object();
Object o2 = new Object();
Set<Object> set = new HashSet<Object>();
set.add(o1);
CustomObservableList<Object> list = new CustomObservableList<Object>(FXCollections.observableArrayList(set));
list.add(o2);
list.add(o1); // throw Exception
}
}