如何将相同的ListEventPublisher和ReadWriteLock传递给GlazedLists中的CollectionList和子事件列表?

时间:2016-10-25 01:05:13

标签: java glazedlists

人员类:

public class Person {

    private final String name;
    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

众议院课程:

public class House {

    private final EventList<Person> residents = new BasicEventList<>();

    public void addResident(Person resident) {
        residents.add(resident);
    }

    public EventList<Person> getResidents() {
        return residents;
    }
}

初始化代码:

EventList<House> houses = new BasicEventList<>();

CollectionList<House, Person> allResidents = new CollectionList<>(houses, new CollectionList.Model<House, Person>() {

    @Override
    public List<Person> getChildren(House parent) {
        return parent.getResidents();
    }
});

jTable.setModel(GlazedListsSwing.eventTableModel(allResidents, new String[]{"name", "age"}, new String[]{"Name", "Age"}, new boolean[]{false, false}));

House firstHouse = new House();
houses.add(firstHouse);
firstHouse.addResident(new Person("John", 18));

House secondHouse = new House();
houses.add(secondHouse);
secondHouse.addResident(new Person("Mary", 44));
secondHouse.addResident(new Person("Alisa", 6));

所以有房子,其中包含居民名单。该表应显示所有房屋的所有居民。

新居民可以随时加入房屋,因此桌子应该能够反映出这些变化。这就是为什么EventList是将居民存放在一个房子里的明显选择。

但是,GlazedLists要求CollectionList和常驻EventList使用相同的ListEventPublisherReadWriteLock

问题

我应该如何将ListEventPublisherReadWriteLock传递给每个CollectionList实例的EventList和常驻House,考虑到

  • 每次移除或添加居民到房子时,表格都会更新吗?
  • House类的实例可以创建 之前 创建CollectionList之后 所有 strong>必须是有效的条目吗?

请注意,第二个标准使得无法从Publisher获取LockCollectionList并将其传递给新House的构造函数。 (因为房屋可能在列表本身之前创建)

是否可能有其他解决方法而非共享PublisherLock

相关问题: How to deal with GlazedLists's PluggableList requirement for shared publisher and lock

1 个答案:

答案 0 :(得分:0)

没有关于它的文档,但此方法适用于在列表之间共享ListEventPublisherReadWriteLock

public static final ListEventPublisher PUBLISHER = ListEventAssembler.createListEventPublisher();
public static final ReadWriteLock LOCK = LockFactory.DEFAULT.createReadWriteLock();

将这些变量放在某处,然后将它们传递给新EventList s

的每个构造函数

我通过查看GlazedLists的源代码找到了这一点,并看到他们以这种方式创建锁和发布者。不幸的是,我不知道这种方法是否有任何缺点,或者它是否是一种正确的方法。