2012-04-29 13 views
13

Me preguntaba cómo sería posible crear mi propio oyente para algo, y poder usarlo como cualquier otro oyente, por ejemplo.Crear oyentes personalizados en Java

public interface Listener { 

    public void onListen(Event e); 

} 

Y luego esto en mi clase

public class test implements Listener { 

    Object.add(new Listener() { 

     @Override 
     public void onListen(Event e) { 

     } 
    }); 
} 

Creo que lo que realmente estoy pidiendo también donde puedo definir cómo comprobar si pasa algo perteneciente al oyente que creo?

Si algo de esto no tiene sentido, por favor dígame y lo aclararé.

Si en el mejor de los casos esto no tiene sentido para usted, intentaré esto. ¿Cómo puedo hacer que un oyente compruebe si la opción seleccionada en un cuadro combinado ha cambiado a una opción diferente? En realidad, no necesito un oyente combobox, eso fue solo un ejemplo.

+1

De hecho, su pregunta no tiene sentido todavía. ¿Estás preguntando cómo registrar a tu oyente con algo? ¿O cómo invocar al oyente en el momento relevante? ¿O algo mas? –

+0

¿Cómo crearía un oyente personalizado para, por ejemplo, verificar si se modificó una opción de ComboBox? – Pjrat111

+2

@ Pjrat111: Su ejemplo particular se explica en el tutorial de Java Swing: http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html#listeners. –

Respuesta

16

Aquí es un breve ejemplo:

private static class Position { 
    } 

    private static class Ball { 
     private ArrayList<FootballObserver> observers = new ArrayList<FootballObserver>(); 
     private Position ballPosition = new Position(); 

     public void registerObserver(FootballObserver observer) { 
      observers.add(observer); 
     } 

     public void notifyListeners() { 
      for(FootballObserver observer : observers) { 
       observer.notify(ballPosition); 
      } 
     } 

     public void doSomethingWithFootballPosition() { 
      //bounce etc 
      notifyListeners(); 
     } 
    } 

    private static interface FootballObserver { 
     void notify(Position ball); 
    } 

    private static class Player implements FootballObserver { 
     public void notify(Position ball) { 
      System.out.println("received new ball position"); 
     } 
    } 

    public static void main(String... args) { 
     FootballObserver player1 = new Player(); 
     Ball football = new Ball(); 
     football.registerObserver(player1); 
     football.doSomethingWithFootballPosition(); 
    } 
+3

Véase también ['EventListenerList'] (http://docs.oracle.com/javase/6/docs/api/javax/swing/event/EventListenerList.html). – trashgod

+1

@trashgod gracias por la sugerencia. No fue fácil de entender. Encontré esto útil: http://www.java2s.com/Tutorial/Java/0260__Swing-Event/ManagingListenerListswithEventListenerList.htm. – qben

0

No hay problemas para crear los oyentes que necesita, pero sólo se puede aplicar a las clases que lo esperan (por lo que no puede hacer (new Object()).addMyListener)

Usted tendrá que añadir a las clases en las que desee utilizar el oyente un método addMyListener(MyListener myListener). Simplemente almacena los oyentes que le pasas en una lista para el usuario posterior. Sería una buena idea crear una interfaz con el método addMyListener (y un fireMyListeners()) también.

Por supuesto, también debe proporcionar el código para llamar al método fireMyListeners(), también. Luego, el fireMyListeners() simplemente recorrerá los oyentes y llamará a su método de notificación.

Cuestiones relacionadas