Gente eu dei uma pesquisada e achei alguns tópicos parecidos ai no GUJ, mas não exatamente iguais.
Seguinte:
1º - Em uma janela eu terei que ter vários temporizadores com valores únicos e TODOS decrementando ao mesmo tempo.
2º - adicionar em qual quer momento outro temporizador a esta janela, sem alterar os outros valores já rodando.
Minhas dúvidas são as seguintes:
Como eu devo fazer (de forma mais simples e/ou documentada possível) para que todos contadores rodem simultaneamente.
E quando eu adicionar um novo contador a janela com os contadores inserir este novo sem precisar de um botão “refresh” ou algo parecido.
Guarde seus temporizadores numa coleção thread-safe, e decremente-os no evento de processamento do Timer. Há uma boa discussão sobre a classe Timer aqui:
Muito obrigado, mas por acaso alguém teria mais informações sobre essa coleção “Thread-safe”?
Obrigado pessoal!
R
roger_rf
Uma coleção thread-safe é uma coleção que pode ser usada com segurança por múltiplas threads ao mesmo tempo. Vector, por exemplo, é thread-safe, mas ArrayList não é. (A propósito, não use Vector! :)) Uma maneira de obter uma instância thread-safe de List é usar o método Collections.synchronizedList():
Eu fiz esse demo para demonstrar como eu faria isso. Cada Temporizador é uma TimerTask, que executa sozinho. Um Timer (não o do Swing) faz a "batida" de bumbo. Mas a idéia é que poderiam ser Threads mesmo.
Só uma ideia de como poderia ficar.
importjava.awt.FlowLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.util.Timer;importjava.util.TimerTask;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.JScrollPane;publicclassMain{publicstaticclassTemporizadorextendsTimerTask{privatefinalJLabellabel;privateintcontador;privatefinalStringnome;publicTemporizador(JLabellabel,intinicio,Stringnome){this.label=label;this.contador=inicio;this.nome=nome;}@Overridepublicvoidrun(){this.contador++;//faz o que tem de fazer, aqui só somathis.label.setText(this.nome+": "+this.contador);//define um novo nome}}publicstaticclassAdicionadorimplementsActionListener{privatefinalJPanelpanel;privatefinalTimertimer;privateintcontador;publicAdicionador(JPanelalvo,Timertimer){this.panel=alvo;this.timer=timer;}@OverridepublicvoidactionPerformed(ActionEvente){contador++;JLabellbl=newJLabel("Temporizador iniciando...");Temporizadort=newTemporizador(lbl,0,"Temporizador "+contador);this.panel.add(lbl);this.panel.validate();//para poder desenhar o label na telatimer.schedule(t,2000,1000);//espera 2s para a primeira execução, 1s para cada próxima}}publicstaticvoidmain(String[]args){Timertimer=newTimer("Temporizadores",true);//principal que irá fazer a mágicaJButtonbtn1=newJButton("Adicionar um temporizador!");//vai adicionando novosJPaneljp=newJPanel(newFlowLayout());//não necessariamente o melhor Layout....Adicionadoradicionador=newAdicionador(jp,timer);btn1.addActionListener(adicionador);jp.add(btn1);JFramejf=newJFrame("Demo java.util.Timer");jf.add(newJScrollPane(jp));//scrollpane para mostrar todo mundojf.pack();jf.setSize(400,400);jf.setVisible(true);}}
guisantogui
Brigadão cara, to vendo que essa bosta vai me encomodar, toda ajuda é válida!