Monitorar mudanças de um atributo

3 respostas
black_fire

E ai pessoal, blz?

Seguinte, estou montando uma aplicação SoketServer, tenho uma classe que guarda todos os dados da aplicação (conexões ativas, inativas, aguardando resposta, finalizadas, etc…)

Cada vez que um cliente se conecta a aplicação dispara uma nova Thread e alimenta esses valores…

Como é uma aplicação swing, estarei exibindo estes dados em realtime no front-ent no formato de número e gráficos.

:?: Ai que vem minha dúvida: Tenho como adicionar um evento para monitorar a mudança destes atributos? Assim, automaticamente quando estes valores mudarem eles serão atualizados no front-end

:idea: Pensei em criar uma Thread para isso, mas imaginei que deve ter uma forma mais simples.

Um abraço galera… :wink:

3 Respostas

TedLoprao

Eu não entendi muito bem a situação, mas acredito que se vc utiliza-se um padrão como o Observer resolveria o seu problema!!!
Só acho que teria que ver como ficaria a carga na rede…

O Observer funciona como o esquema de listeners do swing, vc pode ter uma lista do objetos que estão olhando para o modelo de dados (no caso os dados que serão apresentados), e sempre que este for alterado, vc manda uma mensagem para os objetos pertencentes a lista de observadores.

black_fire

Olha eu respondendo eu mesmo… :slight_smile:

:smiley: :smiley: :smiley: puts, consegui…
O único problema é que não consigo disprar os eventos para cada atributo apenas para a classe inteira, mas até ai blz, já vai quebra um galhão. Como já tá tarde pacas amanhã vou dar mais uma olhada. Mas acho que eu tô quase lá… Apesar que o que já consegui até aki, vai ajuda bastante.

Como eu sou um dos poucos loucos que usa Swing :shock: , segue abaixo o cógo pra se algum dia outro kra maluco aparecer por aki. Vou ver se amanhã, consigo dispara os eventos para cada atributo…

Achei algumas apis que talvez me ajudem…
java.beans.PropertyChangeListener
java.beans.PropertyChangeEvent
Tem tbm um tutorial sobre isso, vou dar um look…
http://java.sun.com/docs/books/tutorial/uiswing/overview/event.html
http://java.sun.com/docs/books/tutorial/javabeans/properties/bound.html

Um abraço galera… :wink:

/*
by Rodrigo G. Tavares de Souza
*/
import java.awt.AWTEvent;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.EventListener;

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

import java.awt.EventQueue;

public class TestaEventos extends JFrame implements AtributosListener {

	public static void main(String[] args) {
		TestaEventos app = new TestaEventos();
	}
	
	public TestaEventos() {
		atributos = new Atributos();
		// adiciona o evento na lista de eventos
		atributos.addTotalChangeListener(this);
	
		addWindowListener(
			new WindowAdapter() {
				public void windowClosing(WindowEvent evt) { 
					System.exit(0);
				}
			}
		);
		
		setResizable(false);
		GridLayout g = new GridLayout(3,2);
		getContentPane().setLayout(g);
		
		jLblTotal = new JLabel("Total");
		jLblVlrTotal = new JLabel("0");
		
		jLblAtivo = new JLabel("Ativo");
		jLblVlrAtivo = new JLabel("0");
		
		jBtnIncTotal = new JButton("   +   ");
		jBtnDecAtivo = new JButton("   -   ");
		
		getContentPane().add(jLblTotal);
		getContentPane().add(jLblVlrTotal);

		getContentPane().add(jLblAtivo);
		getContentPane().add(jLblVlrAtivo);
		
		getContentPane().add(jBtnIncTotal);
		getContentPane().add(jBtnDecAtivo);
		
		jBtnIncTotal.addActionListener(
			new ActionListener() {
				public void actionPerformed(ActionEvent evt) {
					atributos.incTotal();
				}
			}
		);
		
		jBtnDecAtivo.addActionListener(
			new ActionListener() {
				public void actionPerformed(ActionEvent evt) {
					atributos.decAtivo();
				}
			}
		);
		
		pack();
		show();
		
	}
	
	// Este metodo é disparado quando a classe Atributos sofre uma alteração
	public void atributosChange(AtributosEvent evt) {
		jLblVlrAtivo.setText(String.valueOf(atributos.getAtivo()));
		jLblVlrTotal.setText(String.valueOf(atributos.getTotal()));
	}
	
	Atributos atributos;
	
	JLabel jLblTotal;
	JLabel jLblVlrTotal;
	
	JLabel jLblAtivo;
	JLabel jLblVlrAtivo;
	
	JButton jBtnIncTotal;
	JButton jBtnDecAtivo;
}

final class Atributos extends Component {
	
	public Atributos() {
		// Solicita a inclusão do envento na lista de eventos
		evtq =  Toolkit.getDefaultToolkit().getSystemEventQueue();
		// Habilita o evento na lista de eventos
		enableEvents(0);
	}
	
	public void incTotal() { 
		ativo++;
		total++;
		// comunica uma alteraçào na classe
		sendEvent();
	}
	
	public void decAtivo() {
		if (ativo > 0) ativo--;
		// comunica uma alteraçào na classe
		sendEvent();
	}
	
	public int getAtivo() {
		return ativo;
	}
	
	public int getTotal() {
		return total;
	}
	
	// Informa que houve uma alteração na classe, disparando o evento... 
	private void sendEvent() {
		AtributosEvent ae = new AtributosEvent(this);
		evtq.postEvent(ae);
	}
	
	// Este metodo inclui uma instância do objeto na lista de ouvintes
	// os eventos não serão disparados...
	public void addTotalChangeListener(AtributosListener a) {
		listener = a;
	}
	
	// Verifica se evento foi disparado e a procedência do evento... 
	public void processEvent(AWTEvent evt) {
		if (evt instanceof AtributosEvent) {
			if (listener != null) {
				listener.atributosChange((AtributosEvent) evt); 
			}
		}
		else super.processEvent(evt);
	}
	
	private int ativo;
	private int total;
	
	private AtributosListener listener;
	private static EventQueue evtq;
	
}

interface AtributosListener extends EventListener {
	public void atributosChange(AtributosEvent evt); 	
} 

class AtributosEvent extends AWTEvent {
	// Atribui um código para a lista de eventos
	// a constante AWTEvent.RESERVED_ID_MAX informa qual o código máximo
	// utilizado pelo awt, desta forma o código do evento deve
	// estar fora deste range...
	public AtributosEvent(Atributos a) {
		// contrói uma ligação entre o objeto e código do evento...
		super(a,ATRIBUTO_ID_EVENT);		
	}
	public static final int ATRIBUTO_ID_EVENT = AWTEvent.RESERVED_ID_MAX + 31103;
	
}
black_fire

“TedLoprao”:
Eu não entendi muito bem a situação, mas acredito que se vc utiliza-se um padrão como o Observer resolveria o seu problema!!!
Só acho que teria que ver como ficaria a carga na rede…

O Observer funciona como o esquema de listeners do swing, vc pode ter uma lista do objetos que estão olhando para o modelo de dados (no caso os dados que serão apresentados), e sempre que este for alterado, vc manda uma mensagem para os objetos pertencentes a lista de observadores.

Vixi, tava postando a msg quando você mandou uma resposta.

Andei procurando no google algo sobre Observer e achei um tutorial, pelo que vi na descrição é mais ou menos o meu problema. Tenho uma classe que pode ser acessada por várias Threads diferentes e preciso monitorar esta classe para exibir os dados sempre que ela sofre uma alteração.

:arrow: Vou dar uma garimpada pra ver se o Observer é mais fácil de implementar do que o que eu fiz acima.

Valeu a atenção kra, um abraço… :wink:

Criado 3 de novembro de 2003
Ultima resposta 3 de nov. de 2003
Respostas 3
Participantes 2