Pregunta

Estoy escribiendo una aplicación Java usando widgets SWT. Me gustaría actualizar el estado de ciertos widgets cuando ocurra un determinado evento (por ejemplo, actualizar el estado del modelo de datos).

¿Hay algo en Java similar al NSNotificationCenter de Cocoa, donde puedo registrar un objeto para escuchar eventos de notificación y responder a ellos, así como tener otros objetos & "; disparar &"; una notificación?

¿Fue útil?

Solución

Ok, supongamos que, por ejemplo, desea que se notifique a partes de su programa cuando su Loader inicia un escaneo y cuando finaliza un escaneo (no se preocupe por lo que es un Loader, o qué es un escaneo, estos son ejemplos de algún código que tengo desde mi último trabajo). Defina una interfaz, llámela & Quot; ScanListener & Quot ;, como

public interface ScanListener
{
  public void scanStarted();
  public void scanCompleted();
}

Ahora el cargador define un método para que su otro código se registre para devoluciones de llamada, como

public void addScanListener(ScanListener listener)
{
  listeners.add(listener);
}

El cargador, cuando inicia un escaneo, ejecuta el siguiente código

for (ScanListener listener : listeners)
{
  listener.scanStarted();
}

y cuando termina, hace lo mismo con listener.scanCompleted ();

El código que debe notificarse de estos eventos implementa esa interfaz (ya sea ellos mismos o en una clase interna) y llama a " loader.addScanListener (this) " ;. Sus métodos scanStarted () y scanCompleted () se llaman en los momentos apropiados. Incluso puede hacer esto con devoluciones de llamada que toman argumentos y / o devuelven resultados. Todo depende de usted.

Otros consejos

¿Qué tipo de notificaciones estás buscando? Si todo lo que desea es que un objeto pueda decirle a alguien más & "; Hey, he cambiado, actualice en consecuencia &"; La forma más fácil es usar la interfaz Observador existente y la clase Observable. O escriba el suyo propio con una interfaz que defina cómo desea que se llame a los oyentes desde el que ha cambiado.

No hay un servicio por proceso preexistente que despache eventos en Java que sea equivalente al NSNotificationCenter predeterminado. En java, el tipo de evento se especifica porque el objeto de evento es un tipo particular (lo que también significa que el método de notificación depende de ese tipo) en lugar de usar una cadena. Antes de los genéricos, no es posible escribir un despachador y receptor de eventos generales que también sea seguro para los tipos (sea testigo de la proliferación de las clases * Event y las interfaces * EventListener en las bibliotecas AWT y Spring).

Hay algunas instalaciones para el envío de eventos. Como Paul , hay java.util.Observable, que como usted señala , requiere subclases. También hay java.beans.PropertyChangeSupport, que podría ser útil dependiendo de su situación.

También puedes escribir uno tú mismo. La fuente de PropertyChangeSupport es probable que esté disponible en openjdk, y puede mirar el Evento Apache Commons abandonado proyecto. Dependiendo de sus necesidades, es posible que deba preocuparse por cosas como subprocesos, seralización, pérdidas de memoria (garantizar el registro o usar referencias débiles) y modificaciones concurrentes (iterar sobre una copia de su lista de oyentes, ya que un oyente puede decidir anular el registro) en respuesta a un cambio).

Ahora que existen genéricos en Java, sería posible una biblioteca genérica de despacho de eventos; Sin embargo, no he encontrado ninguno. ¿Alguien?

En realidad, hay una instalación integrada en Java que hace exactamente lo que quieres, pero no es algo que hayas considerado y, para ser sincero, es probable que sea un poco pesado para lo que quieres.

Dicho esto, sin embargo, existe.

Es JMX.

Usted crea MBeans, y luego otros pueden registrarse para eventos desde esos MBeans. El MBean puede enviar una notificación.

Personalmente, no consideraría usarlo para este caso (me gustaría sacar el mío), pero la instalación está allí y está bien definida y documentada.

No es Java, pero el proyecto IPython tiene un centro de notificaciones escrito en Python aquí que puede usar como plantilla para una versión de Java.

En Java esto sería un proveedor disparando notificaciones a sus oyentes. Pero Java no ofrece el acoplamiento flexible que obtienes con NSNotification de Cocoa porque en Java los proveedores y suscriptores deben tener referencias mutuas. Compare para este capítulo 18 en & Quot; Learn Objective-C for Java Developers & Quot ;.


Hay una implementación de IOS NSNotificationCenter en Java .
Puede encontrar el código fuente en: Este proyecto de Github

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top