Boa tarde, estou tendo um probleminha na minha aplicação para controlar os botões, tenho meu form principal que aciona um outro, quando eu efetuo a transação nesse novo form, devo fecha-lo e mudar os botões do principal mas ele não esta fazendo correto.
[code]
public void trataBotoes( final JButton[] btns ) {
final Runnable r = new Runnable() {
public void run() {
for ( int i = 0; i < btns.length; i++ ) {
btns[ i ].setEnabled( !btns[ i ].isEnabled() );
}
}
};
Runnable executa = new Runnable() {
public void run() {
SwingUtilities.invokeLater( r );
}
};
Thread t = new Thread( executa );
t.start();
Cara coloquei desse jeito, ele entra na thread nos 2 runs mais mas não troca o estado dos botões, não usei esse for com os botões eu preciso somente de alguns, o que esta de errado?
public void trataBotoes( ) {
final Runnable r = new Runnable() {
public void run() {
//chega aqui mas não faz nada
btnDiscar.setEnabled(false);
btnRediscar.setEnabled(true);
btnDesligar.setEnabled(false);
btnHold.setEnabled(false);
btnUnhold.setEnabled(false);
btnPausa.setEnabled(true);
btnTransferencia.setEnabled(false);
btnConferencia.setEnabled(false);
btnDisponivel.setEnabled(true);
}
};
Runnable executa = new Runnable() {
public void run() {
SwingUtilities.invokeLater( r );
}
};
Thread t = new Thread( executa );
t.start();
}
Nossa que saudade do javascript, mas como viram estou apanhando, alguem tem algum exemplo de como fazer o que eu quero, simplesmente habilitar e desabilitar alguns botões apos fechar um form secundario?
Primeiramente, gostaria de ressaltar que só deve ser usado o SwingUtilities.invokeLater se o metodo a ser chamado não estiver presente na (EDT - Event Dispatch Thread, que é a thread do Swing). Para saber se o metodo ja está presente ou nao é só fazer uma condicao chamando o método SwingUtilities.isEventDispatchThread(). Se retornar TRUE nao deve ser chamado o invokeLater. E se precisar chamar não deve ser incluída dentro de uma outra thread.
public void executaOperacao(){
if (!SwingUtilities.isEventDispatchThread()){
// NAO ESTÁ NA EDT, CHAMAR O INVOKE LATER
}
}
Pedrosa, o codigo que voce postou nao deixou clara a ordem na qual os eventos são chamados, pois pode ser que o metodo “trataBotoes” nao esteja sendo chamado no tempo certo.
Voce poderia postar o codigo de forma a mostrar a sequencia da execucao?
Tente tirar o SwingUtilities.invokeLater() de dentro da thread, ele ja eh uma thread, nao precisa estar dentro de outra. Se isso nao resolver, contact-me novamente