0

人物クラス:

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、居住者を 1 つの家に格納するための当然の選択である理由です。

ただし、GlazedLists では、CollectionListと レジデントEventListがすべて同じListEventPublisherと を使用する必要がありReadWriteLockます。

質問

それを考慮して、すべてのインスタンスのListEventPublisherとのReadWriteLock両方に同じものを渡すにはどうすればよいでしょうか。CollectionListEventListHouse

  • 家の居住者を削除または追加するたびにテーブルを更新する必要がありますか?
  • Houseクラスのインスタンスは、それ自体の作成と作成後の両方で作成でき、それらはすべて有効なエントリである必要がありますか?CollectionList

2 番目の基準により、からPublisherandを取得して、それらを new のコンストラクターに渡すことができなくなることに注意してください。(家はリスト自体の前に作成される可能性があるため)LockCollectionListHouse

とを共有する以外の回避策はPublisherありLockますか?


関連する質問: GlazedLists の PluggableList の共有パブリッシャーとロックの要件に対処する方法

4

1 に答える 1

0

それに関するドキュメントはありませんが、このアプローチは共有ListEventPublisherReadWriteLockリスト間で機能します:

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

EventListこれらの変数をどこかに置き、 newのすべてのコンストラクターに渡します

GlazedLists のソース コードを調べてこれを発見し、GlazedLists がロックとパブリッシャーをそのように作成しているのを見ました。残念ながら、このアプローチに欠点があるのか​​ 、それとも正しい方法なのかはわかりません。

于 2016-10-28T17:29:06.077 に答える