Odświeżenie GUI poprzez inny wątek

Odpowiedz Nowy wątek
2011-08-28 21:08
Galica
0

Witam. Mam program główny, w którym GUI jest oparte o swinga i w zależności od jednego z 4 stanów elementy mają różne parametry.

public class Frame extends JFrame implements Runnable {
Status status = 1;
...
@Override
    public void run() {
        switch (status) {
            case 1:
            ...
            case 2:
            ...
    }
 
public void updateGUI(Status status) {
       this.status = status;
       SwingUtilities.invokeLater(this);
    }

I jeśli chcę odświeżyć gui wywołuje tylko updateGUI z odpowiednim parametrem i wszystko jest cacy. Jednak program tworzy też dodatkowy wątek, który po przetworzeniu odpowiednich danych powinien zmienić GUI programu głównego. Niestety nie mogę w tym wątku wywołać metody updateGUI(..).

Będę wdzięczny za każdą wskazówkę.

Pozostało 580 znaków

2011-08-29 00:19
0

Myślę, że mógłbyś zaimplementować wzorzec Obserwator(http://en.wikipedia.org/wiki/Observer_pattern), który pozwala na tego typu przekazywanie informacji o zakończeniu pracy różnym odbiorcom.


Pozostało 580 znaków

2011-08-29 12:19
0

Tamten drugi wątek też mógłby raczej wykonywać invokeLater. Myślę jednak, że lepiej byłoby wykorzystać SwingWorker: http://download.oracle.com/ja[...]swing/concurrency/worker.html http://download.oracle.com/ja[...]/javax/swing/SwingWorker.html jeżeli masz np dużo obliczeń, a chcesz na bieżąco informować o postępie.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2011-08-29 12:29
Galica
0

dzięki mykhaylo, zapoznam się z tym mechanizmem. A co do invokeLater to owszem korzystam z niego gdy wypisuje dane do jTextArea. I to działa dobrze. Są to jednak sporadyczne działania, więc SwingWorker mi raczej na niewiele się zda. Głównie zależy mi jak odświeżyć wiele elementów grafiki w tym wątku. Oczywiście mogę wszystkie potrzebne elementy przekazać podczas tworzenia wątku, ale to będzie z ~20 elementów. Zastanawiam się czy jest prostszy sposób.

Pozostało 580 znaków

2011-08-29 15:54
0

Grafiki czy GUI? Bo metody AWT są wielowątkowe, a swinga jednowątkowe (tylko EDT). Nie napisałeś dlaczego w innym wątku nie możesz uruchomić updateGUI.
I na marginesie - dostęp do pola status powinien być albo synchronizowany, albo przynajmniej z modyfikatorem volatile. Nie bardzo też wiem dlaczego pole status, które jest wygląda na typ obiektowy inicjujesz wartością int czyli 1, a także używasz go w switchu. Czym jest "Status"?


Jeżeli ktoś komuś coś, ewentualnie nikt nikomu nic, to właściwie po co...?

Pozostało 580 znaków

2011-08-29 19:25
Galica
0

A więc z wywołaniem updateGUI() już sobie poradziłem. Co do obiektu Status to jest to typ wyliczeniowy, a 1 i 2 podałem tylko dla uproszczenia. I masz rację, dostęp do pola Status powinien być synchronizowany, tak więc dzięki za to, ale muszę sprawdzić czy w ogóle może wystąpić jednoczesny dostęp do tego pola z dwóch "miejsc".

Dostęp do pola status jest pakietowy (brak modyfikatora), a więc musisz zakładać, że dostęp z kilku miejsc jest zawsze możliwy. Być może powinieneś zmienić jego dostęp na private. - Olamagato 2011-08-31 11:11

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0