Jestem w trakcie pisania niedużej aplikacji bazodanowej w javie z wykorzystaniem SWT/Jface. I natrafiłem na pewien problem architektoniczny który już od dawna zaprzątał mą głowę, niestety nie mogę znaleźć nic ciekawego przez wujka google.

Problem polega na tym, że chciałbym ujednolicić sposób komunikacji poszczególnych komponentów między sobą. Nie wiem czy odpowiednio w tej chwili to robię, czy nie ma jakiegoś sensownego rozwiązania w samym SWT. Aktualnie gdy jakieś dwa komponenty zależą od siebie to jeden z nich jest dodawany jako PropertiesChangeListener do drugiego i nasłuchuje na odpowiednią zmianę którą to wywołuję za pomocą FirePropertyChange.

Dla przykładu: mam drzewo katalogów, jeśli np. usunę jakiś element z tego drzewa wywołuję FirePropertyChange("treeChanged", oldNode, newNode), a zainteresowane komponenty przechowują drzewo jako PropertyChangeListener i reagują na zmianę "treeChanged".

Cały ten mechanizm wykorzystuje java.beans.PropertyChangeSupport.

I teraz parę pytań z tym związanych:

  1. Czy jest to w ogóle odpowiednie wykorzystanie tej biblioteki? Wydawało mi się, ze w Swingu jeśli coś jest elementem JavaBeans to wystarczy go dodać jako listenera i przy zmianie dowolnego pola wywoływał on będzie odpowiednie zdarzenie. Niestety w SWT nie widzę czegoś takiego, na razie wsparcie dla PropertyChange widziałem tylko w Action gdzie są funkcje addIPropertyChangeListener i remove, ale ja potrzebuję komunikację pomiędzy różnymi kontrolkami które już takich funkcji nie mają.

  2. Pojawił mi się także problem z łączeniem poszczególnych elementów. Np. w tej chwili chciałbym, żeby jakaś tabela reagowała na zmiany w menu preferencji i ciężko mi dodać jeden z nich do drugiego jako PropertyChangeListener. Brakuje jednego miejsca w którym to wszystko by było realizowane, gdzie łączyłbym kontrolki zależnościami między sobą. I tak w tej chwili robię to np. w konstruktorze. Ale gdy pojawiła się potrzeba połączenia kontrolek mało ze sobą związanych to nie za bardzo wiem gdzie to uczynić (jedna np. jest już stworzona, druga dopiero tworzy się w trakcie wykonywania aplikacji itp.).

  3. Ten punkt wynika z 2-go. Pomyślałem, że może wartoby zrobić jakieś hierarchiczne dodawanie elementów w postaci takiego drzewa. Czyli np. klasa główna aplikacji dodaje jako Listenery wszystkie swoje dzieci, one swoje itd. I potem przekazywać takie zmiany w górę drzewa i propagować je z powrotem w dół w kierunku zainteresowanych komponentów. Ale wydaje mi się to dosyć skomplikowanym zadaniem.

Na pewno mieliście styczność z wielkimi projektami, jak to się tam realizuje? Będę wdzięczny za wszelką pomoc, gdyż chciałbym to zrobić porządnie :).