Uaktualnienie interfejsu i wątki

0

Witam

Męczę się już dość długo z pewnym problemem, nawet przykład w książce nie działa tak jak go tam opisali (sic).

Generalnie o co mi chodzi:

Chcę aby po przyciśnięciu przycisku wyświetlił się na labelce info o tym np że program aktualnie pracuje.
Następnie program zajęty jest obliczaniem, po jego zakończeniu labelka wyświetla tekst: zakończono.

Jednak gdy się nie użyje wątków dopiero po wykonaniu wszystkiego następuje aktualizacja interfejsu, czyli po przyciśnięciu program przystąpi do obliczeń a po ich zakończeniu wyświetli się tekst pracuje a za tym od razu zakończono.

Nie wiem jak to zrobić na wątkach tak aby działało właściwie.

Próbowałem z:

class ModyfikujEtykiete implements Runnable
    {
        public void run()
        {
                EventQueue.invokeLater(new Runnable() {

                    public void run() 
                    {
                        
                        etykieta.setText("Trwają obliczenia");

                    }
                });
        }

Dzięki :)

0

hmmyyy, ekspertem to ja nie jestem;), ale coś by mi semafory spasowały do tego problemu. Poczytaj trochę o semaforach, możesz sam napisać prostego semafora, jest też klasa Semaphore, ale nie nigdy jej nie używałem więc nie pomogę skodzić, pewnie nie trudne, spróbuj tak, aktualizację textu przycisku robisz w osobnym wątku, zadania wykonuje się w osobnym. (osobnych), jak wątek zakończy zadanie sygnalizuje, czekającemu wątkowi żeby zmienił text, jak masz trzy opcje napisu to robisz trzy semafory, do których mają dostęp obydwa wątki, jeśli nie wiesz poczytaj trochę o tym, a ładnie to powinna chulać.

Ale z semaforami to ostateczna opcja, na pewno to można zrobić bez tego, dużo łatwiej i szybciej.

Tak mi się wydaje, ale mądrzejsze głowy się moze wypowiedzą, bo to tylko takie moje gdybanie, zresztą możesz to zrobić przy pomocy zmiennej logicznej w jednym wątku, i chyba będzie najłatwiej.

Pozdrawiam

0

W kodzie listenera do buttona:

...
public void actionPerformed(ActionEvent evt) {
    EventQueue.invokeLater(new Runnable() {
        label.setText("Pracuje");
    });
    // obliczenia
    label.setText("Koniec");
}

Cos takiego powinno zadzialac.

0

Zle, takie cos raczej :D

public void actionPerformed(ActionEvent evt) {
    label.setText("Pracuje");
    Thread t = new Thread(new Runnable() {
        public void run() {
            // obliczenia
            ...
           // gdy koniec obliczen:
           EventQueue.invokeLater(new Runnable() {
                public void run() {
                     label.setText("Koniec");
                 }
           )};
        }
    });
}

Chyba.

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