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

Senhor, há muito tempo eu estava tentando entender como posso começar a trabalhar програсс-bar, mas não tenho nada e não deu certo.
A situação é que o processamento de uma grande variedade de objetos, entende-se que a for-loop.
No JFrame há прогрессбар.
O código fica assim:

SwingUtilities.invokeLater(new Runnable(){

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


progressBar não é actualizada durante a execução do for-loop.
E como só ele trabalhará, o usuário é imediatamente vê já preenchido прогрессбар.
E quando дебаге visto que o value dele muda. Mas a tela não acontece nada.


Answers 3:

Share:


Dan Emb
Answer 1

Quando você diz

SwingUtilities.invokeLater(runnable)
este executável é executado a partir de event-dispatching thread-a, que é o único. Após a chamada para
progressBar.setValue(progress)
ressurge o valor na tela, deve voar para o evento. E é, em vez disso, é enviada para a fila event-dispatching thread-a, porque o seu ciclo ainda não terminou.

Faça os seus cálculos em outro thread, e não no event dispatcher-e. Por exemplo, você pode fazer isso SwingWorkere


Sufaid PP
Answer 2

Em geral, é aqui que tudo está escrito
download.oracle.com/javase/tutorial/uiswing/components/progress.html


Chris Black
Answer 3

Assim você mesmo não é dado o controle. Em um segmento consecutivos de tudo o que acontece, quando deveria ter tempo para fazer o upgrade? Leia aqui: download.oracle.com/javase/tutorial/uiswing/concurrency/index.html