2016-04-15 18 views
0

Ich habe ein Problem. Auf meiner (Eclipse 4 basiert) GUI habe ich zwei Objekte:Progressbar nicht in der Zeit aktualisiert

Button button = new Button(groupInitialize, SWT.NONE); 
ProgressBar bar= new ProgressBar(group, SWT.SMOOTH); 

ich eine listner für die Schaltfläche festgelegt, so dass zu jeder Zeit, dass die Taste eine Ausarbeitung gedrückt wird beginnen. Während dieser Ausarbeitung muss die Statusleiste aktualisiert werden.

// Button listener definition! 
button .addListener(SWT.Selection, new Listener() { 
    @Override 
    public void handleEvent(final Event event) { 
     Runnable run = new Runnable() { 
      @Override 
      public void run() { 
       Display display = PlatformUI.getWorkbench().getDisplay(); 
       display.asyncExec(new Runnable() { 
        public void run() { 
         myLongLastingMethod(); 
        } 
       }); 

      } 
     }; 
     new Thread(run).start(); 
    } 
}); 

und das ist, was ich in der myLongLastingMethod tun():

private void myLongLastingMethod() { 
    action1(); 
    update(); 

    action2(); 
    update(); 

    action3(); 
    update(); 
} 

Und schließlich die Update-Methode (die die Fortschrittsbalken aktualisieren -should-):

AKTUALISIERT

private void update() { 
    if (progressBar.isDisposed()) { 
     return; 
    } 
    int selection = progressBar.getSelection(); 
    progressBar.setSelection(++selection); 
} 

Ich bin mir sicher, dass ich etwas falsch mache ... Any ich Dea/Hilfe warum sollte es nicht funktionieren?

Antwort

1

Ihr Hintergrundthread Runnable verwendet display.asyncExec, um Ihre lang laufende Methode aufzurufen. display.asyncExec führt den Code im Benutzeroberflächen-Thread aus, sodass während der Ausführung dieses Codes nichts anderes in der Benutzeroberfläche passiert. Sie sollten nur asyncExec verwenden, um Funktionscode auszuführen, der die Benutzeroberfläche aktualisiert.

Rufen Sie einfach myLongLastingMethod direkt im Hintergrund Thread ohne den asyncExec Aufruf.

So:

public void handleEvent(final Event event) { 
    Runnable run = new Runnable() { 
     @Override 
     public void run() { 
      myLongLastingMethod(); 
     } 
    }; 
    new Thread(run).start(); 
} 
+0

wie folgt aus: public void handle (letzte Ereignis event) {myLongLastingMethod();} ? – Kasper

+0

Nein, Sie müssen immer noch einen Hintergrund-Thread ausführen, Code hinzugefügt, um zu beantworten. –

+0

ok Ich habe es aber immer noch nicht funktioniert wie in der run-Methode sind wir nicht im UI-Thread (in der Tat habe ich eine Ausnahme). – Kasper