2015-08-18 11 views
8

In meinem TableViewer habe ich einen OwnerDrawLabelProvider, wo ich für eine bestimmte Spalte in meiner Tabelle eine ProgressBar zu einer TableEditor-Instanz hinzufüge.Wie aktualisiert ProgressBar in TableViewer?

Mein Problem ist folgendes:

Ich bin in der Lage, die Auswahl der ProgressBar zu setzen, sondern, wenn man versucht, sie zu aktualisieren auf dem gleichen Wert bleibt.

Code:

@Override 
public void update(ViewerCell cell) { 
if(columnIndex == 4){ 

      Table table = tableViewer.getTable(); 
      TableItem item; 
      TableItem[] items; 
      TableEditor editor;    

      items = table.getItems(); 
      ProgressBar bar = new ProgressBar(table, SWT.NONE); 
      bar.setMinimum(0); 
      bar.setMaximum(100); 
      bar.setState(SWT.NORMAL); 
      bar.setSelection(0); 
      bar.setLayoutData(new GridData(SWT.FILL,SWT.CENTER,true,true)); 
      if(mediator.isSent()){ 
       List<Item> itemsSendToSubmit = mediator.getItemsSendToSubmit(); 
       if(!itemsSendToSubmit.isEmpty()){ 
        for(Iterator<Item> itemIterator = itemsSendToSubmit.iterator(); itemIterator.hasNext();) 
        { 
         Item itemSubmited = itemIterator.next();       
         for(TableItem tableItem: items) 
         {        if(tableItem.getText(0).contains(itemSubmited.getId())) 
          {     
          bar.setSelection(PluginUtility.getBuildProgress(itemSubmited.getPlan())); 
           editor = new TableEditor(table); 
           editor.grabHorizontal = true; 
           editor.grabVertical = true; 

           editor.setEditor(bar, tableItem, 4);      

          } 
         }     
        } 
       } 
      } 
     } 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

ich ein Problem gelesen, dass setSelection Methode für ProgressBar einige Probleme hat. Ich habe meine eigene ProgressBar erstellt, indem ich die Basisklasse erweitert habe und die setSelection-Methode mit dem Fixcode übersteuert habe, aber immer noch nicht funktioniert.

In einer normalen Hauptfunktion funktioniert das.

Kann ich einige Vorschläge bekommen, was das Problem sein kann oder wie das Hinzufügen dieses ProgressBar in einem TableViewer sein Verhalten beeinflusst?

EDIT: Wenn ich eine einzelne Instanz von Fortschrittsbalken beim Erstellen des Label - Providers erstellt und dann an den Tableeditor übergebe, wird der Fortschrittsbalken für das letzte Element, auf dem ich sage, editor.setEditor (bar, tableItem, 4); aber ich muss eine Fortschrittsanzeige für jeden Artikel anzeigen und für jeden Artikel aktualisieren!

+1

Aktualisieren Sie die gleiche ProgressBar-Instanz? Oder Sie erstellen bei jedem Update ein neues. Wenn Sie die gleiche Instanz verwenden, sollten Sie ihren Zustand nur aktualisieren, indem Sie setSelection (...) aufrufen; – stan

+0

Eine neue Instanz für jedes Update. In der Tat spielt es keine Rolle, da ich immer den Editor erstelle und die neue Instanz darauf setze. –

+0

Können Sie sagen, wie viele Artikel die Tabelle haben wird? Bei einer großen Anzahl von Items empfehle ich, den Fortschrittsbalken _zuziehen_, um Ressourcen zu sparen. –

Antwort

0

Vielleicht passiert das Update, aber die Visuals werden nicht aktualisiert, je nachdem, wie Sie diesen Code aufrufen.

Sie müssen sicherstellen, dass Sie nicht den UI-Thread mobilisieren, wenn Sie dieses Update durchführen.

In Eclipse 3.x bedeutet dies

Display.getDefault().asyncExec(new Runnable() { 
    public void run() { 
    // ... do any work that updates the screen ... 
    } 
}); 

oder mit Injektion mit dem UISynchronize in 4.x

Grundsätzlich den setSelection Code in dort gesetzt zu bekommen.

Lesen Sie diesen Artikel auf der Hintergrundverarbeitung in Eclipse-Plugins: http://www.vogella.com/tutorials/EclipseJobs/article.html

0

Wenn Sie den Wert von ProgressBar aktualisieren, danach müssen Sie die Tableviewer mit all seinen Eigenschaften neu zu zeichnen/neu streichen, dann wird es das Update zeigen Fortschrittsanzeige. Hoffe das wird dein Problem lösen.