2010-02-09 12 views
14

En Eclipse RCP, estoy creando vistas para la Perspectiva usando IPageLayout.addView(...)¿Cómo comunicarse entre vistas en Eclipse RCP?

Pero de esta manera no tengo una referencia a la vista. Por lo tanto, no sé cómo puedo decirle a ViewA que actualice ViewB.

¿Cuál es el mejor patrón para usar aquí?

Respuesta

15

Además de lo VonC ha mencionado anteriormente, también se puede utilizar ISourceProviderListener si los cambios la necesidad no se desencadena por la selección.

  • Tener ViewB implementa ISourceProviderListener
  • Crear una implementación de ISourceProvider y registrarlo en los servicios
  • a Tiene ViewA obtener el ISourceProvider y actualizarlo para activar los cambios en ViewB

Lea la documentación en esas interfaces junto con IServiceLocator y ISourceProviderService para tener una mejor idea de cómo se desarrolla todo.

También puede ver this Lars Vogel's tutorial que tiene algún ejemplo de cómo utilizar la ISourceProvider

+0

'ISourceProviderListener': echaba de menos que uno. Buena solución también. +1. Y eso ahora sería "Además de lo que VonC ha mencionado ** a continuación **";) – VonC

+1

Lamentablemente, ya no es así como funcionan las cosas en e4. No más vistas y editores, solo ... partes. La información sobre cómo funciona la comunicación entre ellos parece difícil de encontrar para e4. Para cualquier otra persona que esté buscando, [este tutorial más nuevo] (http://www.vogella.com/tutorials/Eclipse4EventSystem/article.html) parece indicar el camino. –

8

Usted tiene el diferente paradigma de comunicación se resumen en el IBM article

  • Para realizar una vista capaz de escuchar a los cambios de selección, una visión debe implementar la interfaz ISelectionListener y debe registrarse con la página de la mesa de trabajo
  • Uso La interfaz IAdaptable: una clase que implementa IAdaptable tiene la capacidad de devolver dinámicamente ciertos tipos de adaptadores que luego pueden utilizarse para recuperar más información.
  • cambio de propiedad paradigma oyente

Con respecto al primer enfoque, los detalles del artículo:

Una forma más inteligente de consumir selecciones de interfaz de usuario es registrar las opiniones de los consumidores como a los oyentes a partes específicas de vista. Como puede ver en el siguiente ejemplo, la ID de vista de la parte de la vista de origen se menciona como un parámetro durante el registro de un oyente de selección.

getSite().getPage().addSelectionListener("SampleViewId",(ISelectionListener)this); 

Este enfoque elimina las devoluciones de llamada redundantes a la vista del consumidor que se produciría si ese punto de vista se registraron como un oyente no específica.

El fragmento de código en el Listado 2 muestra el método de la opinión de que crea un JFaceTableViewer y lo añade como un proveedor de selección para el sitio createPartControl() banco de trabajo. Este código permite que cualquier cambio en la selección de UI en el TableViewer se propague a la página y finalmente a las vistas del consumidor interesadas.

Listado 2. Configuración de un proveedor de selección

public void createPartControl(Composite parent) { 
    // Set up a JFace Viewer 
    viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); 
    viewer.setContentProvider(new ViewContentProvider()); 
    viewer.setLabelProvider(new ViewLabelProvider()); 
    viewer.setSorter(new NameSorter()); 
    viewer.setInput(getViewSite()); 

    // ADD the JFace Viewer as a Selection Provider to the View site. 
    getSite().setSelectionProvider(viewer); 

} 

Va a encontrar un enfoque similar en el RCP tutorial for eclipse3.5 (update February, 4th 2010)

1

Hay diferentes maneras de ver e plugin de comunicaciones: eventbroker, etc .. oyente

EvenBroker (E4) Ejecución: Utilice event broker para enviar mensajes (cadenas) entre vistas y complementos.

remitente lateral:

@Inject 
private IEventBroker eventBroker; 
private static final String STATUS ="status"; 
eventBroker.send(STATUS, "status test message.."); 

receptor lateral:

@Inject 
private IEventBroker eventBroker; 
private static final String STATUS ="status"; 
@Inject @Optional 
public void getEvent(@UIEventTopic(STATUS) String message) { 
    ... //call method 
} 
+0

No duplicaría la variable 'STATUS' (solo tiene que tenerla como' cadena final pública estática 'y hacer referencia a ella desde el emisor y el receptor), pero de lo contrario, esta es la manera de entrar en e4. Por cierto, puede enviar cualquier objeto que desee de esta manera, no solo cadenas, y si desea que esto suceda de forma asíncrona, use 'broker.post()' en lugar de 'broker.send()'. –

Cuestiones relacionadas