Swing - pasek postępu

Autor:amy crehore

Panowie, przez długi czas próbowałem dowiedzieć się, jak uruchomić pasek programu, ale nic nie udało mi się zrobić.
Sytuacja jest taka, że ​​przetwarzana jest duża liczba obiektów, jasne jest, że w pętli for.
W ramce JFrame znajduje się pasek postępu.
Kod wygląda następująco:
 

SwingUtilities.invokeLater(new Runnable(){

    @Override
    public void run(){
    for(Geoobject geoobject:Geoobjects){
        //здесь нужно поменять значение прогрессбара
        //Какие-то действия с объектом
        for(Rajon rajon:geoobject.getRajonsSet()){
            //Здесь нужно поменять текст на прогрессбаре
            //Какие-то действия с объектом
        }
    }
});


progressBar nie jest aktualizowany podczas działania pętli for.
Natychmiast po uruchomieniu użytkownik widzi już pasek postępu.
Co więcej, podczas debugowania staje się jasne, że zmienia się jego wartość. Ale nic się nie dzieje na ekranie.

Komentarze:
A co dokładnie się dzieje? Czy to nie jest aktualizowane? - juliana
Powiedzmy, że nie jest aktualizowany podczas działania cyklu.
Natychmiast po uruchomieniu użytkownik widzi już pasek postępu.
Co więcej, podczas debugowania staje się jasne, że zmienia się jego wartość. Ale nic się nie dzieje na ekranie. - lisa s

Odpowiedzi

alex popa
Po powiedzeniu
SwingUtilities.invokeLater(runnable)
, ten program startowy zaczyna się od event dispatching thread -a, który jest jedyny. Aby wartość na ekranie była aktualizowana po wywołaniu
progressBar.setValue(progress)
, wydarzenie musi lecieć. Zamiast tego jest on wysyłany do kolejki wątków wywołujących zdarzenia, ponieważ cykl jeszcze się nie zakończył.

Wykonuj obliczenia w innym wątku, a nie w zdarzeniu dispatcher-e. Na przykład możesz to zrobić w SwingWorker
Odpowiedzi:
I ja, głupiec, pomyślałem, że SwingUtilities tworzy nowy wątek, a w nim ...
Dzięki, będę się uczyć. - olivia todman
Powodzenia :) - kizhepat
solenn
ruth anne
Więc nie dajesz kontroli. W jednym strumieniu wszystko dzieje się, gdy powinno zostać zaktualizowane? Przeczytaj tutaj: download.oracle.com/javase/tutorial/uiswing/concurrency/index.html
Odpowiedzi:
To jest mój problem - nie rozumiem.
Mam wystąpienie JProgressBar w EventDispatcher.
z innego wątku (który jest wywoływany za pomocą SwingUtilities w pytaniu) Zmiana jest wprowadzana do właściwości paska postępu, który jest głównym wątkiem. I nie działa.
Rozumiem, że robię coś złego, ale po prostu nie mogę tego zrozumieć w żaden sposób - jak to prawda? - prahallad badami
Czy istnieją dobre i kompletne podręczniki dotyczące języka HTML5 i CSS3 w języku rosyjskim? :: Jakie oprogramowanie do testowania bezpieczeństwa jest optymalne pod względem ceny / możliwości? :: Jak zrobić tabelę HTML z klocków 3D? :: Jak nie pracować w nadgodzinach? :: Kto może doradzić w podręczniku na temat konfiguracji serwera do masowych wysyłek (nie spam)?
Zostaw odpowiedź
Linki