2011-01-14 12 views
4

Ich versuche, einige Elemente in meiner Tabelle auszuwählen, aber ich möchte nicht, dass sie aufgedeckt werden. Das Problem ist, dass beim Aufruf der Methode (siehe unten) automatisch showSelected() innerhalb von Table.class aufgerufen wird, und das ist nicht was ich will.Wie kann ich die Auswahl für eine swt-Tabelle mit setSelection festlegen und die Einstellung layer auf false setzen?

tableViewer.getTable().setSelection(lastSelectedIndices); 

Ich habe versucht, die Auswahl Einstellung Tableviewer verwenden, aber aus irgendeinem Grund hat es ex nicht: tableViewer.setSelection(new StructuredSelection (lastSelectedIndices), false); diese Codezeile verursacht nicht alles ausgewählt werden.

Kann ich trotzdem die Tabellenzeilen auswählen und sie NICHT anzeigen lassen? In meinem System muss ich jedes Mal, nachdem das Raster aktualisiert wurde, setSelection aufrufen, damit der Benutzer sein ausgewähltes Element nicht verliert. Das Problem tritt auf, wenn der Benutzer das Raster nach unten scrollt -> wenn zu diesem Zeitpunkt eine Aktualisierung stattfindet, springt das Raster zurück zu den ausgewählten Elementen. Es sieht wirklich komisch aus, wenn der Benutzer einen Tisch runterscrollt und die Bildlaufleiste plötzlich nach oben springt.

Jede Hilfe wird sehr geschätzt!

--code für den Tisch nach oben -

 // add table viewer 
    tableViewer = new TableViewer(this, SWT.MULTI | SWT.FULL_SELECTION | SWT.VIRTUAL); 
    tableViewer.setUseHashlookup(true); 
    tableViewer.addFilter(new GridPanelViewerFilter()); 
    tableViewer.setComparator(new GridPanelViewerComparator()); 
    tableViewer.setComparer(new GridPanelElementComparer()); 

    table = tableViewer.getTable(); 
    GridData tableGd = new GridData(SWT.FILL, SWT.FILL, true, true); 
    table.setLayoutData(tableGd); 
    table.setHeaderVisible(true); 
    table.setLinesVisible(true); 
    // set table font 
    setTableFont(); 

    // listen to paint events for anti aliasing 
    table.addPaintListener(...etcetc 

--- Code für die Tabelle erfrischend -

 protected void refreshGrid() { 
    if(!updateGrid) return; 
    Display.getDefault().asyncExec(new Runnable() { 

     @Override 
     public void run() { 
      try { 
       // check if disposed 
       if (isDisposed()) { 
        log.log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, getClass().getName() + ": " + "Grid already disposed")); 
        return; 
       } 
       // refresh table 
       table.setRedraw(false); 
       try {     
        // get last selected indices from mouse down event 
        tableViewer.refresh(true, false); 
        if(lastSelectedIndices != null){ 
         tableViewer.getTable().deselectAll(); 
         tableViewer.getTable().select(lastSelectedIndices); 
        } 

       } catch (Exception e) { 
        log.log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, 
          getClass().getName() + ": " + "Error at refresh table", e)); 
       } 
       table.setRedraw(true); 
       // process post grid refresh 
       postGridRefresh(); 

      } catch (Exception e) { 
       log.log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, getClass().getName() + ": " + "Error during refresh grid", e)); 
      } 
     } 
    }); 
} 

Antwort

1

Versuchen Table.select(indexes) aufschlussreich zu verhindern verwenden.

Aber mit TableViewer.refresh() sollte eigentlich die Auswahl beibehalten. Nur eine wilde Vermutung, aber vielleicht versuchen Sie TableViewer.setUseHashlookup(true) bevor Sie irgendwelche Eingaben auf Ihrem TableViewer setzen.

Verwenden Sie einen VIRTUAL Table? Wenn ja, versuche es zuerst ohne das VIRTUAL-Flag.

+0

Ich habe TableViewer.refresh() und TableViewer.setUseHashlookup (true) verwendet, aber die Auswahl bleibt nicht erhalten. Ich habe die von Ihnen vorgeschlagene Zeile versucht, Table.select (Indizes), aber es führt immer noch zu der Tabelle Indizes. Interessanterweise ruft diese Methode showSelection() nicht innerhalb von Table.class auf (im Gegensatz zu setSelection). Denkst du, dass eine andere Klasse/Code die Auswahl offenlegt? – codegurl