estou com um problema no JProgressBar: Qdo eu executo o Runtime.getRuntime().exec() a minha ProgressBar fica parada, sendo que eu a coloquei em uma nova Thread, na verdade todo o meu JFrame fica parado esperando o Runtime.getRuntime().exec() terminar, ja tentei colocar a ProgresseBar em uma Thread e o Runtime.getRuntime().exec() em outra Thread, mas o problema continua o mesmo.
A minha progressBar serve so pra ficar alguma coisa se movendo na interface gráfica pro usuário não achar que travou. Sim mas vamos ao problema…
Eu preciso que ela funcione qdo o Runtime.getRuntime().exec() do método ControlaExecucao().executaPHYML() estiver executando, mas ela fica travada enquanto o Runtime.getRuntime().exec() executa, não entendo o por que, sendo que ela está em uma nova Thread.
Se alguém puder me ajudar…
flw
mas a minha ja está rodando em um Thread… igual a sua, mas msm assim ela não atualiza…
ja me falaram q eu teria q fazer outra Thread pra ficar atualizando a progressBar, como seria essa atualização…?
flw
fabiofalci
Olha ali um exemplo de como eu atualizei. Usei a classe javax.swing.Timer
this.timer = new Timer(50, this);
Que a cada 50 milliseconds chama o método actionPerformed que atualiza a progressbar.
J
Junioruesc
mesmo utilizando seu TImer qdo executo o Runtime.getRuntime().exec() a prograssBar continua travada, acabei de tentar com o timer, e nada, so começa a movimentar depois q o Runtime.getRuntime().exec() termina de executar, mas eu preciso da progressBar no momento da execução.
valeu… se souberem de mais alguma dica…
flw
F
fernandolimamanaus
Dá uma olhada em Observer Pattern. Resolveu meu problema…
Você implementa o Observer na classe da GUI e envia as notificações das classes de execução para o seu formulário Swing.
// Classe do Formulário
public class GUI extends JFrame implements Observer {
@Overridepublicvoidupdate(Observableo,Objectarg){if(arginstanceofInteger){if((Integer)arg>100){progressBar.setMaximum(((Integer)arg).intValue());}else{progressBar.setValue(((Integer)arg).intValue());}}elseif(arginstanceofDouble){if((Double)arg>100){progressBar.setMaximum(((Double)arg).intValue());}else{progressBar.setValue(((Double)arg).intValue());}}elseif(arginstanceofBoolean){progressBar.setValue(0);statusBox.append("Processo de geração concluído! \n");statusBox.append("O programa de gravação de iso será iniciado!");}elseif(arg==null){statusBox.append("Processo iniciado...");}}
// Implementação do Runnablepublicvoidrun(){(…)notifyObservers(newInteger(1));// 1 é o progresso atual, mas pode ser um valor qualquer entre o mínimo e o máximo do progresssetChanged();// Faz a atualização da GUI}
}
Estes são apenas fragmentos do código, mas com uma pesquisa breve na internet é possível observar o funcionamento e gerar a implementação.