Atualização dos componentes do JFrame

4 respostas
laudenpower

Olá, gostaria de saber se quando eu altero um componente (JTable, JLabel, etc…) dentro de uma classe que implemente KeyListener se essa alteração é thread safe, ou eu teria que utilizar a classe SwingWorker para isso.
Eu sei que se eu tentar alterar de outra thread essa alteração não é thread safe e para isso podemos usar a classe citada acima, mas no caso de uma classe listener essa alteração vai para EventQueueDispatcher?

Desde já quero agradecer a atenção de todos.

Ps: Já li um monte de coisa e ainda não encontrei essa resposta.

4 Respostas

ViniGodoy

Os eventos dos listerners são disparados na thread do swing, logo, não há necessidade de usar um EventQueue.invokeLater ou EventQueue.invokeandwait neles.

O SwingWorker tem como objetivo retirar o processamento do evento da thread do Swing, e delega-lo à outra thread.

laudenpower

Nesse caso delegando essa tarefa (a atualização dos componentes) a outra thread, eu poderia me previnir de travamentos indesejáveis?
Estou perguntando isso por que eu tinha um timer (java.util.Timer) que setava uma variável boleana para o controle do pressionamento de uma tecla, acontece que depois de um tempo a variável deixava de ser setada ficando alguns minutos até o timer altera-la, essa variável ficava na classe ouvinte dos eventos de teclado (KeyListener) e eu alterava ela do timer.

Gostaria de agradecer a atenção e me desculpar por ter falado alguma besteira.

ViniGodoy

Os travamentos ocorrem pq sempre que há muito processamento na thread do Swing, ele não irá fazer coisas como repintar a tela.

Portanto, sim, deslocar o processamento pra um SwingWorker é a atitude correta a se fazer, via de regra.

laudenpower

Bom pelo menos eu estava no caminho correto… porém os travamentos (na alteração da variável boleana pelo timer) aconteciam mesmo delegando essa tarefa ao SwingWorker. Segue abaixo como está sendo feito:

private void showRomaneioDaVez(){   
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                if (filaRomaneios.getSizeFila() > 0){//Objeto que guarda dentro de si uma fila de objetos            
                    //Alteração dos componentes... 
                }    
            }
        });                
    }

Apenas mais uma pergunta, nesse caso eu estou acessando uma fila (Queue sendo instanciado por uma LinkedList) para saber seu tamanho e retirar um elemento, se eu estiver acessando essa fila de outra thread para inserir elemento, pode ocorrer deadlock ou lentidão? (dessa forma o processamento da interface pode ser atingido por conta de outra thread acessando essa fila). Pelo que eu li LinkedList não é thread safe logo o acesso não deve prejudicar a performance.

Desde já grato pela atenção.

Criado 29 de janeiro de 2010
Ultima resposta 29 de jan. de 2010
Respostas 4
Participantes 2