Сведения о вопросе

Fedya

03:14, 10th August, 2020

Теги

Java   Swing    

Swing — прогрессбар

Просмотров: 370   Ответов: 3

Господа, я долго пытался понять, как же мне заставить работать програсс-бар, но у меня так ничего и не получилось.
Ситуация такая — обрабатывается большой массив объектов, понятно, что в for-цикле.
На JFrame есть прогрессбар.
Код выглядит примерно так:
SwingUtilities.invokeLater(new Runnable(){

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


progressBar не обновляется, пока работает for-цикл.
А как только он отработает, пользователь сразу же видит уже заполненный прогрессбар.
Причем при дебаге видно, что value у него меняется. Но на экране ничего не происходит.



  Сведения об ответе

PROGA

11:01, 23rd August, 2020

Когда вы говорите
SwingUtilities.invokeLater(runnable)
, этот runnable запускается из event dispatching thread-a, который один-единственный. Чтобы после вызова
progressBar.setValue(progress)
обновилось значение на экране, должно вылететь событие. А оно вместо этого отправляется в очередь event dispatching thread-a, потому что ваш цикл ещё не закончился.

Выполняйте свои вычисления в другом потоке, а не в event dispatcher-e. Например, можно сделать это в SwingWorker


  Сведения об ответе

LAST

08:39, 29th August, 2020

А вообще вот тут все написано
download.oracle.com/javase/tutorial/uiswing/components/progress.html


  Сведения об ответе

dumai

12:38, 14th August, 2020

Так у вас же не отдаётся управление. В одном потоке подряд всё происходит, когда оно должно успеть обновиться? Почитайте тут: download.oracle.com/javase/tutorial/uiswing/concurrency/index.html


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться