Wie update/aktualisieren einer Ansicht in ein eclipse-plug-in?

Ich habe eine eclipse-plug-in mit einem einzigen Ansicht (wie das eclipse-helloworld-view-plugin-Projekt). In der view-Datei bekomme ich eine Ereignis, wenn ich will, um die Ansicht zu aktualisieren.

In dieser Ansicht habe ich ein GridData in einer Gruppe mit mehreren labels. Ich habe mehrere Dienstleistungen, die sich registrieren, um das Programm und dessen status angezeigt werden soll in diesem GridData.

Edit: um besser zu zeigen, mein problem habe ich aktualisiert dieses post und fügte hinzu, der ganze code:


CreatePartControl():

public void createPartControl(Composite _parent) {
  parent = _parent;
  createContents();
  addBindings();
  makeActions();
  contributeToActionBars();
}

CreateContents():

protected void createContents() {

  //fixed
  checkIcon = //...
  errorIcon = //...
  smallFont = SWTResourceManager.getFont("Segoe UI", 7, SWT.NORMAL);

  //content
  gl_shell = new GridLayout(1, false);
  //margins, etc. for gl_shell
  parent.setLayout(gl_shell);

  final Label lblGreeting = new Label(parent, SWT.NONE);
  lblGreeting.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1));
  lblGreeting.setText("Hi " + Preferences.getPreName());

  //-- GROUP YOUR STATS (show all services)
  createStatusGroupBox();
}

createStatusGroupBox():

private Group grpYourStatus = null; //outside the method for access in listener (below)

private void createStatusGroupBox() {
  grpYourStatus = new Group(parent, SWT.NONE);
  grpYourStatus.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1));
  grpYourStatus.setText("Your upload status");
  grpYourStatus.setLayout(new GridLayout(3, false));

  //add message if no service is registered
  if ( r.getServiceList().size() == 0 ) {
     Label status = new Label(grpYourStatus, SWT.NONE);
     status.setText("No service registered.");
     new Label(grpYourStatus, SWT.NONE); //empty
     new Label(grpYourStatus, SWT.NONE); //empty
  }

  //add labels (status, message, name) for each registered service
  for ( IRecorderObject service : r.getServiceList() ) {
     Label name = new Label(grpYourStatus, SWT.NONE);
     Label status = new Label(grpYourStatus, SWT.NONE);
     Label message = new Label(grpYourStatus, SWT.NONE);
     message.setFont(smallFont);
     message.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1));

     service.getServiceViewItem().setLabelsAndIcons(name, status, message, checkIcon, errorIcon); //this also sets the values of the labels (label.setText(...) via data binding)
}

Leider, ich weiß nicht, was der richtige Weg ist, um zu aktualisieren/neu zu setzen. Ich habe versucht, die folgenden:

listener (sollte aktualisieren Sie die view /der-Dienste-Liste):

r.addPropertyChangeListener(BindingNames.SERVICE_ADDED, new PropertyChangeListener() {
  public void propertyChange(final PropertyChangeEvent evt) {   
    Display.getDefault().asyncExec(new Runnable() {
      public void run() {
        //This "redraws" the view, but just places the whole content (generated in createStatusGroupBox()) above the other parts.
        //Display.getCurrent().update();
        //createStatusGroupBox();
        //parent.layout(true);
        //parent.redraw();

        //disposes grpYourStatus-Group but doesn't show anything then
        grpYourStatus.dispose();
        createStatusGroupBox();
        grpYourStatus.layout();
        grpYourStatus.redraw(); 
      }
    });
  }
});

Ich habe auch versucht, die folgenden Anweisungen (einzeln); alle ohne Erfolg:

parent.redraw();
parent.update();
parent.layout();
parent.layout(true);
parent.refresh();

In diesem post lese ich Folgendes:

createPartControls ist, dass die Zeit des Lebenszyklus einer Ansicht, wo seine
enthalten widgets erstellt werden (wenn die Anzeige sichtbar wird
zunächst). Dieser code wird nur einmal ausgeführt, während das Leben sehen
Zyklus, daher können Sie nicht noch etwas hinzufügen hier direkt zu aktualisieren Sie Ihre
Blick.

Eclipse Teile, die in der Regel aktualisieren Ihre Inhalte als Reaktion auf ein
geändert Auswahl innerhalb der workbench (z.B. kann der Benutzer klicken Sie auf
auf einem anderen stack-frame in die debug-Ansicht).

Leider, ich weiß nicht, was ich sonst noch versuchen könnte und ich habe nichts gefunden, hilfreich bei der Suche... vielen Dank für deine Hilfe und Anregungen!

InformationsquelleAutor casaout | 2012-11-05
Schreibe einen Kommentar