如何将observableset转换为observablelist

Jap*_*eva 7 java observable java-8 javafx-8

我正在尝试将项目设置为tableview但是setitems方法需要一个observablelist,而我的模型中有一个observableset.FXCollections实用程序类没有一个方法来创建一个可观察的set给出一个可观察的列表.我尝试了但是这导致了一个类强制转换异常(如预期的那样).

目前我正在使用这种代码

new ObservableListWrapper<E>(new ArrayList<E>(pojo.getObservableSet()));
Run Code Online (Sandbox Code Playgroud)

我有一些问题:

  • 将在表中编辑此更新按预期更新基础集?
  • 这是"正确"的做法吗?

所以简而言之,我需要一个样式指南或最佳实践来在可观察集和可观察列表之间进行转换,因为我希望在构建java fx GUI时能够做很多事情

gon*_*ard 4

在表中编辑此内容是否会按预期更新基础集?

不,因为您正在制作该集合的副本:

new ArrayList<E>(pojo.getObservableSet())
Run Code Online (Sandbox Code Playgroud)

这是这样做的“正确”方式吗?

我认为正确的做法不是这样做。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
    }
}
Run Code Online (Sandbox Code Playgroud)