Método setText demora mais que o esperado [RESOLVIDO]

3 respostas
gustavoRamos

Olá a todos do fórum.

Estou desenvolvendo um projeto com swing onde tenho um JLabel que preciso mudar de texto em um determinado momento.
Então, eu faço da seguinte maneira:

bPorta2.setText("Abrir Porta 2");//mudo de texto aqui
        InventarioFacade if1 = new InventarioFacadeImlp(2);
        Thread tInventario = new Thread(if1);
        tModal.start();        
        Thread tMsg = new Thread(msg);
        tMsg.start();
        
        while (!if1.verificaTerminoInventario()){}
        tInventario.interrupt();
        tMsg.interrupt();

O problema é que esse texto demora muito a ser trocado. já debuguei o código e percebi que só depois de completar o interrupt() da 1ª thread (tInventario) é que o texto é efetivamente trocado.

Alguém sabe o por quê disso?

Um abraço a todos!

3 Respostas

T

O Swing tem apenas uma thread para atender a todos os pedidos. Quando você escreve um programa que fica continuamente tentando atualizar a tela, você está trabalhando em uma thread que é diferente da thread do Swing e você não deixa a thread do Swing trabalhar.

Procure por “SwingUtilities.invokeLater

gustavoRamos

Então pessoal, o que o thingol me aconselhou a usar funciona sem maiores complicações.

Mexer com threads nunca foi ‘a coisa mais fácil do mundo’
por isso esse controle de start()'s de threads é um mão na roda.

Agora, só ficou um mínimo detalhe. Essa mesma Thread que eu invoco com o InvokeLater(runnable)…

como faço para matá-la? Uso o interrupt dela direto?

T

invokeLater não cria uma thread; ele requer uma instância de uma classe que implementa o método “run”, e simplesmente chama esse método na mesma thread do Swing, quando possível (é por isso que se chama “invokeLater”; quer dizer “chame mais tarde, quando puder”).

Criado 25 de fevereiro de 2009
Ultima resposta 26 de fev. de 2009
Respostas 3
Participantes 2