tenho uma dúvida: imaginem que eu tenho uma aplicação que abre dois JFrames ou JPanels, como quiserem, simultaneamente. Imaginem também que cada uma dessas janelas devem apresentar uma JTable contendo dados provenientes de tabelas distintas de um banco. Essas JTables devem ser atualizadas automaticamente conforme alterações no Banco de Dados.
A única forma de se fazer isso é utilizando Threads ?
Estou utilizando o MS SQL Server…acredito que não vai sobrecarregar o Banco, pois são consultas simples…
fantomas
Oi rafaelmarch,
Se a coisa é client x server então você poderia fazer o seguinte:
Uma thread para a janela A e outra para a janela B, estipula um período para as threads aguardarem até a hora de fazer uma nova leitura na base de dados (refresh).
E ai, acha que rola?
[]'s
jmoreira
Se as Janelas irão ficar lá… “abertas e quietinhas” e, as grids devem serem atualizadas períodicamente, então… alguém ou alguma coisa deve estar olhando o BD de tempos em tempos. E esse alguém, no mundo Swing é uma thread.
No mundo EJB - utilizando um servidor de aplicação JEE, temos os TimeServices que se encarregam de disparar eventos automaticamente para a aplicação.
Outra opção é utilizar o Framework Quartz fazendo uma dobradinha (se necessário) com o padrão Observer/Observable do J2SE.
Grinvon
A thread principal que executa no swing se chama de Event Dispatch, infelizmente swing foi mal projetado a ponto de “perder” o foco da thread, então por isso há muitos problemas em aplicações com uso de threads no swing.
fabiofalci
Isso, a sun recomenda que tudo que for atualizar tela deva ser executado dentro da EventDispatchThread.
Então se vc não estiver nela, use
Discordo totalmente.
Do meu ponto de vista a maioria das reclamações que ouço a respeito do Swing são provenientes de desconhecimento, e do não entendimento
de como funciona. Por exemplo os Renderers.
victorwss
Discordo totalmente.
Do meu ponto de vista a maioria das reclamações que ouço a respeito do Swing são provenientes de desconhecimento, e do não entendimento
de como funciona. Por exemplo os Renderers.
Mas neste ponto cagaram mesmo. O java 1.1, 1.2 e 1.3 estavam recheados de bugs nisso. Só no 1.4 é que ele se livrou dos bugs de threads. Mas o custo disso foi bastante gambiarra nas classes do swing, um monte de @deprecated, aumento do “java is slow” em alguns pontos e diversas recomendações e procedimentos esotéricos a se tomar poucos conhecidos.
davidbuzatto
Discordo totalmente.
Do meu ponto de vista a maioria das reclamações que ouço a respeito do Swing são provenientes de desconhecimento, e do não entendimento
de como funciona. Por exemplo os Renderers.
Concordo com vc fabiocsi.
Agora quanto a dúvida, não é necessário usar o invokeLater diretamente como sugerido. Se vc estiver usando o Java 6. Existe uma classe chamada SwingWorker que vc deve extender para trabalhar com componentes Swing de forma thread safe. Vc pode também pegar a implementação do SwingWorker caso use uma versão anterior a 6 do Java.
A atualização das tabelas vai ser feita dentro do método doInBackground da sua implementação da SwingWorker.
Já postei um exemplo do SwingWorker aqui no GUJ, dê uma pesquisada. è bem simples de usar.
Até mais!
Shelson
Discordo totalmente.
Do meu ponto de vista a maioria das reclamações que ouço a respeito do Swing são provenientes de desconhecimento, e do não entendimento
de como funciona. Por exemplo os Renderers.
Mas neste ponto cagaram mesmo. O java 1.1, 1.2 e 1.3 estavam recheados de bugs nisso. Só no 1.4 é que ele se livrou dos bugs de threads. Mas o custo disso foi bastante gambiarra nas classes do swing, um monte de @deprecated, aumento do “java is slow” em alguns pontos e diversas recomendações e procedimentos esotéricos a se tomar poucos conhecidos.
Me desculpe, mas estou curioso: Qual a definição de esoterismo em Java ?
ViniGodoy
Acho que exoterismo envolve comandos ou comportamentos obscuros, que normalmente não esperamos por eles.
Exemplos de coisas assim:
O EventQueue.invokeLater, citado acima;
O método wait() pode acordar subitamente (spurious wakeup). Wait(0) espera para sempre (ou até o spurious wakeup ocorrer);
Alguns Streams dão flush automático ao dar close() outros não.
As classes Calendar, GregorianCalendar e Date;
A necessidade de implementar um Document inteiro, só para controlar a quantidade máxima de caracteres de um JTextField;