我正在尝试将项目设置为 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
}
}
关于java - 如何将 observableset 转换为 observablelist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24808243/