| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/09/2009 17:22:16
|
diego_qmota
JavaEvangelist
![[Avatar]](/images/avatar/e355819c0931a90b594aeb8d6a73587f.jpg)
Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline
|
Estou com um problema que creio ser comum entre os programadores que utilizam o SWING e um dos piores...
Eu quero que o usuário ao clicar em um botão, faça o aplicativo realizar uma busca no sistema e que um jlabel indique ao mesmo que essa operação está sendo feita (não quero usar jprogressbar porquê é para uma busca pequena, não sendo necessário usar esse componente).
O problema é que ele não atualiza o jlabel. A tela fica "paralisada" e só quando termina de executar a busca, é que tudo atualiza...
Quando tento usar paint ele sobrescreve o texto que já estava no jlabel, repaint não surte efeito algum... Já tentei usar Thread e também não obtive sucesso. Tampouco com SwingUtilities ou SwingWorker (para dizer a verdade, não consegui compreender o SwingWorker...).
Eu queria fazer isso..algo simples mas que há muito tempo me perturba, porquê eu não consigo fazer funcionar...
Estou tentando usar os seguintes métodos:
This message was edited 4 times. Last update was at 30/09/2009 20:58:45
|
"Go ahead, make my day!" |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/09/2009 19:31:58
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
Problema comum? Sim. Um dos piores? Nem de longe. Você precisa mesmo usar threads ou o SwingWorker. Vai ficar mais ou menos assim: O que acontece é o seguinte. O swing tem uma fila de mensagens. Toda vez que você atualiza um JLabel, ele muda suas propriedades e chama o método repaint(), indicando ao Swing que ele deve redesenhar a tela. Esse método, enfilera uma requisição, que será processada assim que a thread do Swing estiver desocupada. Entretanto, ações de botão também são tratadas na thread do Swing. Portanto, se seu código que executa a busca foi disparado pelo método do botão, ele se torna um dos itens da fila do swing a ser processado. Cada troca de JLabel lá, só empilhará um comando de pintura para ser executado depois que seu método terminar. Por isso, outros comandos como invalidate() repaint() e updateUI() serão igualmente inúteis. A solução para isso é fazer a execução da busca em outra thread. Seja disparando a thread diretamente (como eu fiz), ou indiretamente através do SwingWorker.
This message was edited 1 time. Last update was at 30/09/2009 19:35:48
|
@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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/09/2009 20:58:13
|
diego_qmota
JavaEvangelist
![[Avatar]](/images/avatar/e355819c0931a90b594aeb8d6a73587f.jpg)
Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline
|
VALEU! DEU CERTO!
MUITO OBRIGADO! MEUS PROBLEMAS DE JLABEL CONGELADOS ACABARAM (e faz tempo que tinha esses problemas...)!!!
|
"Go ahead, make my day!" |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/10/2009 08:50:25
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
Só um detalhe. Quando estiver rodando de outra thread, o ideal é trocar as linhas que alteram os componentes do swing, como essa: Por isso aqui: Isso porque os comandos de pintura devem, necessariamente, serem executados na thread do swing. O resto do processamento, sim, pode ir para fora. Eu criei uma classezinha utilitária para reduzir um pouco a verbozidade disso. Com ela você pode chamar: Acho que não tem uma função para o setIcon, mas não deve ser difícil inserir.
This message was edited 1 time. Last update was at 01/10/2009 08:50:50
|
@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 |
|
|
 |
|
|
|
|