Как передать один и тот же ListEventPublisher и ReadWriteLock в CollectionList и дочерние списки событий в 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 использовали одни и те же ListEventPublisher и ReadWriteLock.

Вопрос

Как я должен передавать одни и те же ListEventPublisher и ReadWriteLock как CollectionList, так и резидентным EventList каждого экземпляра House, учитывая, что

  • таблица должна обновляться каждый раз, когда я удаляю или добавляю жителя в дом?
  • экземпляры класса House могут быть созданы как до, так и после создания самого класса CollectionList, и они все должны быть допустимыми элементами для него?

Обратите внимание, что второй критерий делает невозможным простое получение Publisher и Lock из CollectionList и передачу их конструкторам новых House. (поскольку дома могут быть созданы до самого списка)

Возможно, есть другие обходные пути, кроме совместного использования Publisher и Lock?


Связанный вопрос: Как справиться с требованием GlazedLists PluggableList для общего издателя и блокировки


person Tuupertunut    schedule 25.10.2016    source источник


Ответы (1)


Документации по этому поводу нет, но этот подход работает для разделения ListEventPublisher и ReadWriteLock между списками:

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

Поместите эти переменные куда-нибудь, а затем передайте их каждому конструктору новых EventLists

Я нашел это, просмотрев исходный код GlazedLists и увидев, как они создают свои блокировки и издателей таким образом. К сожалению, я не знаю, есть ли у этого подхода недостатки и является ли он вообще правильным.

person Tuupertunut    schedule 28.10.2016