Odświeżenie GUI poprzez inny wątek

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ę.

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.

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/javase/tutorial/uiswing/concurrency/worker.html http://download.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html jeżeli masz np dużo obliczeń, a chcesz na bieżąco informować o postępie.

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.

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"?

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".

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