java - 如何将 observableset 转换为 observablelist

标签 java java-8 javafx-8 observable

我正在尝试将项目设置为 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/

相关文章:

javascript - 什么时候将文件命名为JS或JSP?

java - 为什么错了?关于 Java 8 流式处理

Java 8 兼容性问题 : How to convert Object array to Subtype List in Java 8?

css - JavaFX CSS : add inner shadow to a pane itself

css - JavaFX 网格 Pane : Shrink if content is disabled and invisible

java - Android Studio 更新后不支持 Gradle 版本

java - BATTERY_PROPERTY_CURRENT_NOW 不适用于所有设备。什么是替代品?

java - 为什么满足 "if ... <=0"标准时没有任何反应?

java-8 - Mockito Java 8 编译错误

Java - 为什么我的静态变量被设置为空?