Criar um evento (sem GUI) para apenas avisar um metodo

17 respostas
M

Pessoal, necessito criar um evento que quando um metodo da classe Automovel() for executado , a classe Pessoa() fique sabendo

como devo proceder?

obrigado

17 Respostas

Felagund

Observer?

leonardom

Você deve usar Observer.

Pattern: http://en.wikipedia.org/wiki/Observer_pattern

API: http://java.sun.com/javase/6/docs/api/java/util/Observer.html

M

certo, este observer concerteza deve funcionar…

porém , ele é um Evento?

é um trabalho … e diz que tenho que criar um evento pra fazer isso.
se o Observer for ta de boa…

valeu !

Andre_Fonseca

oi

vc leu os links?? o Observer é um padrão que sugere uma forma de registar objetos que serão avisados quando um determinado evento ocorrer

este evento pode ser qualquer coisa, como um clique em um botão, uma atualização de uma tabela no banco, etc

abs

M

sim , exato , ai que está…
o que está pedindo no exercicio é que eu crie um Evento para quando um metodo da classe x rodar ele avise a classe y
se eu usar o observer pode até funcionar, porém estaria saindo do foco sendo que o exercicio pede para eu criar um Evento.

abraço

Andre_Fonseca

pelo contrário

você irá criar um evento seu, e irá registar componentes para serem avisados quando o evento ocorrer

aqui tem um artigo bem completo com exemplos de código em java

abs

M

certo, eu li todos os exemplos e executei

vejam como ficou..

Classe que está sendo Observada

import java.util.*;
	public class Automovel extends Observable {

		public Automovel() {
		}
		public void locomover(){
			
			setChanged();
			notifyObservers("Método locomover() foi executado");
		}
	}

e está é a classe que Observa a outra e é avisada.

import java.util.*;
public class Pessoa implements Observer{
	
		public Pessoa(){
			Automovel obj = new Automovel();
			
			obj.addObserver(this);
			
			obj.locomover();
			
		}
	@Override
	public void update(Observable obj, Object resp) {
		System.out.println(resp);
		
			
	}
	public static void main(String[] args) {
		
		
	}

	
		
}

o que quero é que quando o metodo locomover() for executado , ele avise a classe Pessoa.
Eu não entendo muito de java, mas talvez ele até esteja avisando, mas gostaria de entao imprimir um texto por exemplo para ter garantia.

Obrigado

W

Provavelmetne se vc criar uma instancia da classe Pessoa, vai funcionar, tipo:

public static void main(String[] args) {     
      Pessoa p = new Pessoa();                     
}

Porque ai vai executar todo esse pedaco de codigo que tem no construtor Pessoa

public Pessoa(){  
       Automovel obj = new Automovel();                 
       obj.addObserver(this);             
       obj.locomover();                 
}

Nao testei, mas eu acho que eh isso.

//Daniel

M

não te entendi muito bem..

tentei fazer o que voce disse mas nao consegui..

public void locomover(){
			
			
			setChanged();
			notifyObservers("Método locomover() foi executado");
					
		}
este texto que está em notifyObservers();

tem como eu imprimir ele na classe Pessoa ?

import java.util.*;

public class Pessoa implements Observer{
	
	public Pessoa(){
			Automovel obj = new Automovel();
			
			obj.addObserver(this);
			
			obj.locomover();
			
	}

	
	
	
	public static void main(String[] args) {
			
		
		
	}
	@Override
	public void update(Observable arg0, Object arg1) {
		// TODO Auto-generated method stub
		
	}

	
		
}
M

Pessoal , estava falando com meu chefe e não poderei usar o Observer, pois se eu quiser estanciar mais 2 classes depois não vou poder..
confere?

estou tentando fazer com o Listener
mas está dificil

segui mais ou menos um exemplo que achei na net mas não estou conseguindo.

vejam como está meu codigo.

classes na ordem:

public class AutomovelEvent extends java.util.EventObject {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public AutomovelEvent(Automovel source){
		
		super(source);
				
	}
	
	

}
public interface AutomovelListener extends java.util.EventListener {
	
	void iniciarLocomocao(AutomovelEvent e);
	
	void finalizarLocomocao(AutomovelEvent e);



}
public class AutomovelAdapter

       implements AutomovelListener{

	
	public void iniciarLocomocao(AutomovelEvent e) {
		
	}
	
	public void finalizarLocomocao(AutomovelEvent e) {
		
	}
}
public class Automovel extends AutomovelAdapter {
	
	private static final long serialVersionUID = 1L;


	public void locoMover() throws InterruptedException{

		
		iniciarLocomocao(null);
		Thread.sleep(3000);
		finalizarLocomocao(null);
		
		
	}
}
public class Pessoa implements AutomovelListener {
	
	
	
		
	public static void main(String[] args) throws InterruptedException {
		        
	}

	@Override
	public void finalizarLocomocao(AutomovelEvent e) {
		System.out.println("FInalizou");
		
	}

	@Override
	public void iniciarLocomocao(AutomovelEvent e) {
		System.out.println("Iniciou");
		
	}

}

No caso a interface AutomovelListener tem 2 métodos, preciso que:

ao um método deste ser executado ocorra um evento que diga a classe Pessoa que ele está sendo executado( posso colocar uma mensagem dai)

cheguei neste ponto, pelo que me falaram estou no caminho certo, só que agora empaquei !
Parece que tenho o Evento criado , mas não sei como direcionar ele a classe Pessoa.
Me ajudem ai se possivel !
ehehehe

abraço pessoal !

W

marcoantoniosari:
Pessoal , estava falando com meu chefe e não poderei usar o Observer, pois se eu quiser estanciar mais 2 classes depois não vou poder…
confere?

Hummmm ?!?!?!?

M

windsofhell
opa, ehehhee, desculpe cara, acho que não consegui me expressar bem..
enfim, tenho que usar estes Listeners no caso.

todos

pessoal, dei uma pesquisada e me disseram que dá pra fazer isso sem usar este monte de classes que estou usando
utilizando apenas a classe PESSOA e AUTOMOVEL

o esquema é dizer que o AUTOMOVEL é um objeto a ser escutado
e Pessoa é o LISTENER

dai preciso criar uma lista no listener pra quando algo executar no automovel ele me avisar..
alguem pode me ajudar?

tenho isso até entao..

public class Automovel extends java.util.EventObject{

	private static final long serialVersionUID = 1L;

	public Automovel(Automovel source) {
		super(source);

	}
	
	public void iniciarLocomoção(){}
	public void finalizarLocomoção(){}
	
	public void locomover() throws InterruptedException{
		iniciarLocomoção();
		Thread.sleep(2000);
		finalizarLocomoção();		
	}

}
public class Pessoa implements java.util.EventListener {
		
	public static void main(String[] args) throws InterruptedException {
		Automovel a ;
		a = new Automovel(null);
		a.locomover();

	}

}
fantomas

O que vc acha desta idéia aqui?

public class Application {
	
	public static void main(String[] args) throws InterruptedException {
		
		Automovel automovel = new Automovel();
		
		automovel.addActionListener(new Pessoa());
		automovel.addActionListener(new Estacionamento());
		
		automovel.locomover();
	}
}
public class Pessoa implements ActionListener {

	public void actionPerformed(ActionEvent e) {
		System.out.println("PESSOA : "+e.getID()+" > "+e.getActionCommand());
	}

}
public class Estacionamento implements ActionListener {

	public void actionPerformed(ActionEvent e) {
		System.out.println("ESTACIONAMENTO : "+e.getID()+" > "+e.getActionCommand());
	}

}
public class Automovel {
	public static int ACTION_INICIOU_LOCOMOCAO = 1;
	public static int ACTION_FINALIZOU_LOCOMOCAO = 2;	
	
	private List<ActionListener> listeners = new ArrayList<ActionListener>(0);

	public void addActionListener(ActionListener listener) {
		this.listeners.add(listener);
	}
	
	public void iniciarLocomoção(){
		for(ActionListener listener : listeners) {
			listener.actionPerformed(new ActionEvent(this,ACTION_INICIOU_LOCOMOCAO,"INICOU A LOCOMOÇÃO"));
		}
	}
	
	public void finalizarLocomoção(){
		for(ActionListener listener : listeners) {
			listener.actionPerformed(new ActionEvent(this,ACTION_FINALIZOU_LOCOMOCAO,"FINALIZOU A LOCOMOÇÃO"));
		}
	}
	
	public void locomover() throws InterruptedException{
		iniciarLocomoção();
		Thread.sleep(2000);
		finalizarLocomoção();		
	}
}

É isso ai...espero ter ajudado em alguma coisa.

flws

M

cara ! creio que é exatamente isso

daqui eu me viro agora.
obrigado ein !

abraço

M

fantomas
Amigão , é isso ai, consegui !

muito obrigado !

fantomas

:smiley:

M

Olá, só pra ficar registrado :

o exemplo do fantomas está correto.

fiz o dele e fiz de um outro jeito..
vou deixar aqui pra se alguem um dia precisar..

public class AutomovelEvent  extends java.util.EventObject{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public AutomovelEvent(Automovel source) {
		super(source);
		
	}

}
public interface AutomovelListener extends java.util.EventListener {
	
	void iniciou(AutomovelEvent e);
	void finalizou(AutomovelEvent e);

}
public class AutomovelAdapter implements AutomovelListener {
	
	static Automovel automovel = new Automovel();
		
	@Override
	public void finalizou(AutomovelEvent e) {
		System.out.println("O Automovel finalizou Locomoção");
		
	}

	@Override
	public void iniciou(AutomovelEvent e) {
		System.out.println("O Automovel iniciou Locomoção");
		
	}

}
import java.util.ArrayList;
import java.util.Collection;

public class Automovel {
	

	private Collection <AutomovelListener> ArrayListeners = new ArrayList<AutomovelListener>(); 

	public void addActionListener(AutomovelListener listener) {
		 if(!ArrayListeners.contains(listener)) {  
		   
			 ArrayListeners.add(listener);
		   
		 }  
		
	}
	
	
	public void iniciarLocomoção(){
		Collection <AutomovelListener> tl;
		synchronized (this) {  
		   
			 tl = (Collection)(((ArrayList)ArrayListeners).clone());  
		   
	    }  
		
		AutomovelEvent evento = new AutomovelEvent(this);                  
		   
		     for (AutomovelListener t : tl) {  
		   
		             t.iniciou(evento);  
		   
		     }  
		
	}
	
	public void finalizarLocomoção(){
		Collection <AutomovelListener> t2;
		synchronized (this) {  
		   
			 t2 = (Collection)(((ArrayList)ArrayListeners).clone());  
		   
	    }  
		
		AutomovelEvent evento = new AutomovelEvent(this);                  
		   
		     for (AutomovelListener t : t2) {  
		   
		             t.finalizou(evento);  
		   
		     }  
		
	}
	
	
	public String calibrarPneu(int tpoCalibragem){
		String calib = null;
		
		switch(tpoCalibragem){
			case 1: 
				calib = "Viajem";
				break;
			case 2: 
				calib = "Cidade";
				break;
			
		}
		return	calib;
		
		
	}
	public void locomover() throws InterruptedException{
		iniciarLocomoção();
		Thread.sleep(2000);
		finalizarLocomoção();		
	}
}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class Pessoa extends AutomovelAdapter {
	static Automovel automovel = new Automovel();
	
	public static void main(String[] args) throws InterruptedException {
		
		Pessoa pes = new Pessoa();
			
			automovel.addActionListener(pes);
			automovel.locomover();		

	}
	
	@Override
	public void iniciou(AutomovelEvent e) {
		
		super.iniciou(e);
		System.out.println("utilizando tipo de calibragem para "+ automovel.calibrarPneu(1));
	}
	@Override
	public void finalizou(AutomovelEvent e) {
		
		super.finalizou(e);
		System.out.println("utilizando tipo de calibragem para "+ automovel.calibrarPneu(2));
	}

	

}

Neste caso a 2 eventos.

valeu !

Criado 12 de maio de 2009
Ultima resposta 18 de mai. de 2009
Respostas 17
Participantes 6