Temporizadores regressivos

6 respostas
guisantogui

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.

Brigadão mais uma vez!

6 Respostas

R

Use o objeto Timer para gerenciar seus temporizadores:

http://download.oracle.com/javase/6/docs/api/javax/swing/Timer.html

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:

http://download.oracle.com/javase/tutorial/uiswing/misc/timer.html

guisantogui

Muito obrigado, mas por acaso alguém teria mais informações sobre essa coleção “Thread-safe”?

Obrigado pessoal!

R

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():

http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#synchronizedList(java.util.List)

L

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.

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Main {
	
	public static class Temporizador extends TimerTask {
		
		private final JLabel label;
		private int contador;
		private final String nome;
		
		public Temporizador(JLabel label, int inicio, String nome) {
			this.label = label;
			this.contador = inicio;
			this.nome = nome;
		}
		
		@Override
		public void run() {
			this.contador++; //faz o que tem de fazer, aqui só soma
			this.label.setText(this.nome + ": " + this.contador); //define um novo nome
		}
	}
	
	public static class Adicionador implements ActionListener {
		private final JPanel panel;
		private final Timer timer;
		
		private int contador;
		
		public Adicionador(JPanel alvo, Timer timer) {
			this.panel = alvo;
			this.timer = timer;
		}
		
		@Override
		public void actionPerformed(ActionEvent e) {
			contador++;
			JLabel lbl = new JLabel("Temporizador iniciando...");
			Temporizador t = new Temporizador(lbl, 0, "Temporizador " + contador);
			this.panel.add(lbl);
			this.panel.validate(); //para poder desenhar o label na tela
			timer.schedule(t, 2000, 1000); //espera 2s para a primeira execução, 1s para cada próxima
		}
	}
	
	public static void main(String[] args) {
		Timer timer = new Timer("Temporizadores", true); //principal que irá fazer a mágica
		JButton btn1 = new JButton("Adicionar um temporizador!"); //vai adicionando novos
		JPanel jp = new JPanel(new FlowLayout()); //não necessariamente o melhor Layout....
		
		Adicionador adicionador = new Adicionador(jp, timer);
		
		btn1.addActionListener(adicionador);
		
		jp.add(btn1);
		
		JFrame jf = new JFrame("Demo java.util.Timer");
		jf.add(new JScrollPane(jp)); //scrollpane para mostrar todo mundo
		
		jf.pack();
		jf.setSize(400, 400);
		jf.setVisible(true);
		
	}
}
guisantogui

Brigadão cara, to vendo que essa bosta vai me encomodar, toda ajuda é válida!

ViniGodoy

Tópico movido para o fórum de interface gráfica.

Criado 19 de maio de 2011
Ultima resposta 19 de mai. de 2011
Respostas 6
Participantes 4