Atualização dos componentes do JFrame  XML
Índice dos Fóruns » Interface Gráfica
Autor Mensagem
laudenpower
JavaEvangelist
[Avatar]

Membro desde: 28/12/2008 21:00:08
Mensagens: 349
Offline

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.

Enquanto cultivares teu saber, nada tens a temer!

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline

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.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
laudenpower
JavaEvangelist
[Avatar]

Membro desde: 28/12/2008 21:00:08
Mensagens: 349
Offline

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.

This message was edited 1 time. Last update was at 29/01/2010 13:28:52


Enquanto cultivares teu saber, nada tens a temer!

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline

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.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
laudenpower
JavaEvangelist
[Avatar]

Membro desde: 28/12/2008 21:00:08
Mensagens: 349
Offline

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:



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.

Enquanto cultivares teu saber, nada tens a temer!

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999
 
Índice dos Fóruns » Interface Gráfica
Ir para:   
Powered by JForum 2.1.8 © JForum Team