Olá pessoal,
Estou quebrando a cabeça para fazer um exercicio que envolve threads e swing.
O contexto é o seguinte:
Eu tenho uma jpanel, na qual inseri labels (ao rodar coloco numeros), um botão 'calcular' e seis botões que simbolizam as threads.
Ao clicar em um botão 'calcular', no evento desse botão eu realizo cálculos utlizando seis threads, a partir de numeros inseridos na label.
Até aí tudo ok.
No entanto, eu tenho que atualizar os botões conforme o 'status' da thread.
Ou seja, devo mudar a cor:
-para branco quando ela estiver em execução,
- para amarelo quando ela estiver esperando outras threads executarem (join)
- para verde quando ela finalizar...
Coloquei delays nas threads (sleep) para poder visualizar as transições de estado.
Detalhe: nao posso usar observer, tem que ser de outra maneira (pode ser a machado, mas que funcione).
O que acontece, é que mudo a cor, mas eles não atualizam no jpanel. Qndo todas as threads terminam, ele somente atualiza para a cor verde (ultima).
Durante a execução a janela 'trava' e a mudança de cor não acontece. (nem repaint, nem numa outra thread usando SwingUtilities.invokeLater(new Thread())...
O que devo fazer para atualizar a cor do botão no jpanel, durante a execução das threads?
Alguém tem alguma idéia?
Valeu!
Abaixo os códigos:
private void botaoCalcularActionPerformed(java.awt.event.ActionEvent evt) {
btT1.setBackground(Color.GRAY);
btT2.setBackground(Color.GRAY);
//.... até aqui atualiza
final int a = ((Number) txtA.getValue()).intValue();
final int b = ((Number) txtB.getValue()).intValue();
//...
SwingUtilities.invokeLater(new Thread() {
@Override
public void run() {
btT1.setBackground(Color.white); //não atualiza
repaint();
Thread1 t1 = new Tread1(b);
t1.start();
btT1.setBackground(Color.yellow); //não atualiza
try {
t1.join();
btT1.setBackground(Color.green); // é a ultima cor setada.. que permanece
} catch (InterruptedException ex) {
Logger.getLogger(TelaPrincipal.class.getName()).log(Level.SEVERE, null, ex);
}
// e repete o processo.. ao terminar todos, os botões somente ficam com a última cor setada (verde)
e na outra classe está assim
public class Tread1 extends Thread {
private int resultadoT1;
public Tread1 (int b) {
resultadoT1 = b;
}
@Override
public void run() {
this.resultadoT1 = -resultadoT1;
try {
Thread.sleep(3000);
} catch (InterruptedException ex) {
Logger.getLogger(T1.class.getName()).log(Level.SEVERE, null, ex);
}
}
public int getResultadoT1() {
return resultadoT1;
}
}