2009-09-30 7 views
6

Was ich tun möchte, ist in der Lage Tab zwischen Elementen in der Tabelle Tab.Tab zwischen den Feldern in TableViewer

Ich erstelle derzeit meine Tabelle so.

this.tableViewer = 
      new TableViewer(parent , SWT.FULL_SELECTION); 

    tableViewer.setUseHashlookup(true); 
     table = tableViewer.getTable(); 

     GridData gridData = new GridData(GridData.FILL_BOTH); 
     gridData.grabExcessVerticalSpace = true; 
     table.setLayoutData(gridData); 

     table.setLinesVisible(true); 
     table.setHeaderVisible(true); 

     ... 

    /** Create the Cell Editor Array - will hold all columns **/ 
     editors = new CellEditor[table.getColumnCount()]; 
     /** Cell Editor Row 1 **/ 


    /** Set the column properties **/ 
     tableViewer.setColumnProperties(columnNames); 

     /** Assign the cell editors to the viewer **/ 
     tableViewer.setCellEditors(editors); 

     /** Set the cell modifier for the viewer **/ 
     tableViewer.setCellModifier(new MyCellModifier(this)); 
     //Create the Table Viewer 

     /** Table Viewer Content and Label Provider **/ 
     tableViewer.setContentProvider(new MyContentProvider(this)); 
     tableViewer.setLabelProvider(new MyLabelProvider()); 

Aber ich bin mir nicht sicher, wie man die Tabellierung einrichtet. Alles andere funktioniert so weit wie das Bearbeiten von Spalten, das Anzeigen von Daten usw. Einfach auf diesem letzten Teil stecken bleiben.

Wenn ich offensichtliche Dokumentation oder Javadocs verpasst habe - meine Entschuldigung und sogar auf diese zu verweisen wäre großartig.

+0

In welche Richtung möchten Sie Tab? –

Antwort

7

Ich denke, durch Standard-Tab von Zelle zu Zelle springen nicht in einer SWT-Tabelle. Stattdessen geht es zum nächsten Steuerelement. So werden Sie auch, ihm zu sagen brauchen nicht zu durchlaufen, wenn Tab

KeyListener keyListener = new KeyLisener() 
{ 
    public void keyPressed(KeyEvent evt) 
    { 
     if (evt.keyCode == SWT.TAB) 
     { 
      // There are numerous setSelection methods. I'll leave this to you. 
      tableViewer.getTable().setSelection(...) 
     } 
    } 

    public void keyReleased(KeyEvent evt){} 
} 

TraverseListener traverseListener = new TraverseListener() 
{ 
    public void keyTraversed(TraverseEvent evt) 
    { 
     if (evt.keyCode == SWT.TAB) 
      evt.doit = false; 
    } 
} 

tableViewer.getTable().addKeyListener(keyListener); 
tableViewer.getTable().addTraverseListener(traverseListener); 

Auch gedrückt wird, wie derBiggi vorgeschlagen, die Zuhörer auf das Table-Objekt hinzugefügt werden müssen, nicht der Tableviewer.

+0

Der Code könnte vereinfacht werden, wenn der Auswahlcode ('tableViewer.getTable(). SetSelection (...)' in diesem Beispiel) in den 'keyCode == SWT.TAB'-Zweig des' TraverseListener'. Dies würde einen zusätzlichen 'KeyListener' ersparen. –

1

Sie benötigen einen KeyListener aufzuwerten und die Auswahl oder den Fokus auf die nächste Zelle gesetzt:

tableViewer.getTable().addKeyListener(new KeyListener(){ 

    public void keyPressed(KeyEvent e) { 

     System.out.println("Key Pressed"); 
     if (e.keycode == SWT.TAB) 
     { 
      System.out.println("Detected TAB key"); 
      // set table viewer selection 
     } 
    } 

    public void keyReleased(KeyEvent e) { 

     System.out.println("Key Released"); 
    }} 
); 
+0

org.eclipse.jface.viewers.TableViewer akzeptiert keinen KeyListener –

+2

Weiß nicht, ob es funktioniert, aber tableViewer.getTable() sollte es akzeptieren. – derBiggi

+0

Das war das Problem –

9

Obwohl die Lösung thehiatus gepostet ist sehr niedrige Ebene und wird wahrscheinlich funktionieren (ich habe es nicht getestet), gibt JFace Ihnen einen Rahmen für dieses spezielle Problem. Siehe die org.eclipse.jface.viewers.TableViewerFocusCellManager zusammen mit org.eclipse.jface.viewers.CellNavigationStrategy Klassen, um dieses Problem zu lösen.

+1

Das ist ein nützlicher Zeiger, aber die Antwort wäre schöner mit einem Beispielcode oder einer Erklärung, wie diese genau zu verwenden sind. – Kris

3

Ich konnte nicht das gewünschte Verhalten mit einem TraverseListener bekommen (es würde nicht innerhalb der Tabelle durchlaufen), und ich hatte Schwierigkeiten, es mit einem FocusCellManager und CellNavigationStrategy zu arbeiten. Ich habe schließlich diese Lösung gefunden, die es mir ermöglicht, in einer Zeile von Spalte zu Spalte zu springen und den Editor automatisch zu aktivieren.

Viewer viewer = ... 

TableViewerFocusCellManager focusCellManager = 
    new TableViewerFocusCellManager(
     viewer, 
     new FocusCellHighlighter(viewer) {}); 

ColumnViewerEditorActivationStrategy editorActivationStrategy = 
    new ColumnViewerEditorActivationStrategy(viewer) { 

      @Override 
      protected boolean isEditorActivationEvent(
       ColumnViewerEditorActivationEvent event) { 
        ViewerCell cell = (ViewerCell) event.getSource(); 
        return cell.getColumnIndex() == 1 || cell.getColumnIndex() == 2; 
      } 

}; 

TableViewerEditor.create(viewer, focusCellManager, editorActivationStrategy, 
    TableViewerEditor.TABBING_HORIZONTAL); 
0

Ich musste auch Tabbing zwischen Elementen in einer Tabelle implementieren. Wir verwenden Gitter aus dem Nebel als Tabelle. Erstens musste ich den Fokus unterdrücken, um zu verhindern, dass er sich aus dem Tisch bewegt. enter image description here

und dann habe ich ein Key-Listener, die den Fokus/Auswahl auf die nächste Zelle bewegt:

enter image description here

ich auch meine eigenen Algorithmus machte die Auswahl einer Zelle nach rechts zu bewegen, und wenn am Ende der Zeile, verschieben Sie es an den Anfang der nächsten Zeile. Wenn das Tabellenende erreicht ist, wird die Auswahl in die erste Zelle in der Tabelle verschoben.

Dies löste das Problem für mich.

Verwandte Themen