2011-02-13 16 views
7

Estoy tratando de averiguar cómo escuchar un cambio de propiedad en otra clase. A continuación se muestra el código:Java PropertyChangeListener Java

ClassWithProperty tiene la propiedad Quiero escuchar: es

public class ClassWithProperty { 
    private PropertyChangeSupport changes = new PropertyChangeSupport(this); 
    private int usersOnline; 

    public int getUsersOnline() { 
     return usersOnline; 
    } 

    public ClassWithProperty() { 
     usersOnline = 0; 
     while (usersOnline<10) { 
      changes.firePropertyChange("usersOnline", usersOnline, usersOnline++); 
     } 
    } 

    public void addPropertyChangeListener(
     PropertyChangeListener l) { 
     changes.addPropertyChangeListener(l); 
    } 
    public void removePropertyChangeListener(
     PropertyChangeListener l) { 
     changes.removePropertyChangeListener(l); 
    } 
} 

principal donde necesito saber sobre el cambio de propiedad:

public class Main { 

    private static ClassWithProperty test; 

    public static void main(String[] args) { 
     test = new ClassWithProperty(); 
     test.addPropertyChangeListener(listen()); 

    } 

    private static PropertyChangeListener listen() { 
     System.out.println(test.getUsersOnline()); 
     return null; 
    } 

} 

he disparado el evento solo la última vez (usersOnline = 10). Soy nuevo en Java e intenté encontrar una solución, pero fue en vano.

+0

Probablemente no relacionada con su pregunta, pero un problema en el código es que se aumenta usersOnline dos veces cada iteración del bucle Use ++ solo una vez. –

+0

Sí, mi error, pero el problema persiste. Gracias;) – Laphroaig

+0

corrigió el error. – Laphroaig

Respuesta

10

El código

private static PropertyChangeListener listen() { 
    System.out.println(test.getUsersOnline()); 
    return null; 
} 

vuelve null que significa "sin objeto", que a su vez significa que efectivamente es test.addPropertyChangeListener(listen())test.addPropertyChangeListener(null) que no registrará nada.

Debe pasar una instancia válida de PropertyChangeListener al método addPropertyChangeListener().

Editar

le sugiero que lea el capítulo del tutorial de Java sobre PropertyChangeListeners:
http://download.oracle.com/javase/tutorial/uiswing/events/propertychangelistener.html

Otro de los problemas de su código es que llame firePropertyChange() en el constructor de ClassWithProperty. Pero en ese momento, no es posible registrar a ningún oyente, por lo que no tiene ningún efecto. Cualquier llamada a addPropertyChangeListener() ocurre después de ha disparado los eventos.

Aquí está el código modificado de modo que debería funcionar (no lo he probado, aunque ..)

public class ClassWithProperty { 
    private PropertyChangeSupport changes = new PropertyChangeSupport(this); 
    private int usersOnline = 0; 

    public ClassWithProperty() { 
    } 

    public void setupOnlineUsers() 
     { 
     while (usersOnline < 10) 
     { 
      changes.firePropertyChange("usersOnline", usersOnline, ++usersOnline); 
     } 
     } 

    public int getUsersOnline() { 
     return usersOnline; 
    } 

    public void addPropertyChangeListener(PropertyChangeListener l) { 
     changes.addPropertyChangeListener(l); 
    } 

    public void removePropertyChangeListener(PropertyChangeListener l) { 
     changes.removePropertyChangeListener(l); 
    } 
} 

public class MainListener implements PropertyChangeListener { 
    private ClassWithProperty test; 

    public MainListener() { 
     ClassWithProperty test = new ClassWithProperty(); 
     test.addPropertyChangeListener(this); 
     test.setupOnlineUsers(); 
    } 

    public void propertyChanged(PropertyChangeEvent evt) { 
     System.out.println(test.getUsersOnline()); 
    } 

    public static void main(String[] args) { 
     new MainListener(); // do everything in the constructor 
    } 
} 
+0

¿Puede integrar mi código con un ejemplo? lo siento pero soy un javabeginner y no puedo entenderlo. Para mí es difícil de entender debido a mi pobre inglés también (soy de Italia). Muchas gracias. – Laphroaig

+0

¡Sí! ¡Funciona y ahora puedo entender por qué! ¡Muchas gracias! ++++ – Laphroaig

0

Su método aquí:

public ClassWithProperty() { 
    usersOnline = 0; 
    while (usersOnline<10) { 
     changes.firePropertyChange("usersOnline", usersOnline, usersOnline++); 
     usersOnline++; 
    } 
} 

tiene un bucle while que lo hará de forma continua bucle y bloquear el hilo. Mi conocimiento limitado de los oyentes de cambio de propiedad es que escuchan los cambios en una propiedad vinculada, aquí la variable usersOnLine, lo que significa que el cambio de propiedad solo debería activarse si este número cambia (probablemente en setUserOnLine, addUserOnLine, removeUserOnLine y métodos similares). Para más información sobre una propiedad compartida, por favor, mira aquí: Bound Properties

+0

ok gracias de nuevo :) tengo que aprender al respecto. – Laphroaig

+0

Su enlace a propiedades vinculadas murió, intente [this] (http://docs.oracle.com/javase/tutorial/javabeans/writing/properties.html#bound) – Noumenon