java - Desencadenar programáticamente un evento de selección de RCP
eclipse-rcp jface (7)
Acabo de tener este problema y lo resolví así:
treeViewer.getControl.setFocus();
treeViewer.setSelection(new StructuredSelection(element),true);
Dando el enfoque al árbol antes de hacer la selección pareció notificar a los oyentes, donde antes no lo estaba.
En mi aplicación RCP de Eclipse, uso el Servicio de selección como se describe en este article . Hay un TreeViewer en una vista registrado como SelectionProvider :
getSite().setSelectionProvider(viewer);
Otra vista es recibir los eventos del TreeViewer :
selectionListener = new ISelectionListener() {
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
pageSelectionChanged(part, selection);
}
};
getSite().getPage().addSelectionListener(selectionListener);
Todo funciona bien, si los eventos se activan con mis clics normales del mouse. Me gustaría activar mediante programación un evento de selección seleccionando un elemento en el árbol:
treeViewer.setSelection(new StructuredSelection(element),true);
Esto no está funcionando. El método selectionChanged no se llama en la vista de receptor. El tema se discute en este hilo del foro . No hay solución.
EDITAR
No hay una manera adecuada de manejar un clic de ratón activado de la misma manera que una selección programada. Un clic del ratón activa la vista que una selección programada no hace.
Mi solución es registrar la segunda vista del mismo modo que el Selection Service
que la primera vista. Después de eso, ambas vistas obtienen eventos de selección directamente del editor activo.
Asegúrese de que su parte (vista) tiene el enfoque! De lo contrario, setSelection no funcionará.
Primero Inject
PartService en su clase, o agréguelo como parámetro en su método de ejecución de comando ( EPartService partService
), luego haga lo siguiente:
MPart myPart = partService.findPart(MyPart.ID);
partService.activate(myPart, true);
treeViewer.getControl().setFocus();
treeViewer.setSelection(new StructuredSelection(myObject), true);
Intenta hacer un
treeViewer.fireSelectionChanged();
o
treeViewer.firePostSelectionChanged();
después de configurar la selección.
EDITAR
Ok, entonces las llamadas anteriores no funcionan ... Si está lo suficientemente desesperado, puede rastrear las fuentes y averiguar qué es lo que realmente llama a selectionChanged()
. Solo establece un punto de interrupción en tu método y levanta la pila. Tal vez tengas una idea de cómo lograr esta llamada de otra manera.
Intente addPostSelectionListener
lugar de addSelectionListener
para registrar a su oyente en la página de Workbench. Mirando el código de StructuredViewer
, se llamará al método mencionado firePostSelectionChanged
cuando se establezca la selección mediante programación.
Puedes hacer dos cosas:
1) haga la selección y luego llame a los oyentes para un SWT.SELECTION, es decir:
mybutton.setSelection(true);
mybutton.notifyListeners(SWT.Selection, new Event());
El método notifyListener está destinado a ser usado para controles personalizados, por lo que para ser más correcto, podría hacer la opción número 2.
2) llama al método que llamas en tu oyente, es decir:
this.myButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(final SelectionEvent e) {
doSomethingaboutTheSelMethod();
}
En este caso puedes llamar:
doSomethingaboutTheSelMethod();
Yo tuve el mismo problema. La solución que utilicé fue activar el evento en el Listener programmatic-ally después de llamar a treeViewer.getTree().select(treeViewer.getTree().getItem(0));
método.
Consulte a los oyentes registrados en el Árbol y obtenga una referencia para su oyente:
org.eclipse.swt.widgets.Listener[] listeners = treeViewer.getTree().getListeners(SWT.Selection); for (int i=0; i<listeners.length; i++) { if (listeners[i] instanceof TypedListener) { if (((TypedListener)listeners[i]).getEventListener() instanceof TreeSelectionListener){ // Step 2: Fire the event code goes here }}}
Cree un SelectionEvent y active la selección llamando manualmente al método widgetSelected :
Event underlyingEvent = new Event(); underlyingEvent.widget = treeViewer.getTree(); SelectionEvent selectionEvent = new SelectionEvent(underlyingEvent); ((TreeSelectionListener)((TypedListener)listeners[i]).getEventListener()).widgetSelected(selectionEvent);
Esta solución funcionó bien para mí. Espero que lo haga por ti.
StructuredViewer.setSelection(ISelection, boolean)
activará SelectionChangedEvent
menos que:
- el espectador está ejecutando un código que preserva explícitamente la selección (como actualizar) o
- se produce una excepción antes de que llegue a la notificación de eventos (por ejemplo, cuando llama a
setSelection
desde un subproceso que no es de la interfaz de usuario quesetSelection
acceso a subprocesos no válido ).