2009-09-30 6 views
6

Lo que me gustaría hacer es poder tabular entre elementos en la tabla.Pestaña entre campos en TableViewer

Actualmente estoy creando mi tabla como esta.

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()); 

Pero no estoy seguro de cómo configurar la tabulación. Todo lo demás funciona en cuanto a la edición de columnas, datos de muestra, etc. Solo se atascó en esta última parte.

Si me he perdido la documentación obvia o javadocs, mis disculpas e incluso señalar que serían geniales.

+0

¿En qué dirección quiere tabular? –

Respuesta

7

creo por pestaña predeterminada no salta de célula a célula en una tabla SWT. En cambio, atraviesa el siguiente control. Por lo que también tendrá que indicar a no atravesar cuando se pulsa la pestaña

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); 

También, como se sugiere derBiggi, los oyentes deben agregarse al objeto tabla, no el TableViewer.

+0

El código podría simplificarse si el código de selección ('tableViewer.getTable(). SetSelection (...)' en este ejemplo) se pusiera en la rama 'keyCode == SWT.TAB' del' TraverseListener'. Esto ahorraría un 'KeyListener' extra. –

1

es necesario agregar un KeyListener y establecer la selección o el enfoque a la celda siguiente:

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 no acepta un KeyListener –

+2

No sé si funciona, pero tableViewer.getTable() debería aceptarlo. – derBiggi

+0

Ese fue el problema –

9

Aunque la solución thehiatus publicada es de muy bajo nivel y probablemente funcione (no la he probado), JFace le ofrece un marco para este problema específico. Consulte el org.eclipse.jface.viewers.TableViewerFocusCellManager junto con las clases org.eclipse.jface.viewers.CellNavigationStrategy para resolver este problema.

+1

Ese es un puntero útil, pero la respuesta sería más agradable con algún código de muestra o una explicación sobre cómo usar estos con precisión. – Kris

3

No pude obtener el comportamiento deseado con un TraverseListener (no se movería dentro de la tabla), y tuve problemas para hacerlo funcionar con un FocusCellManager y CellNavigationStrategy. Finalmente encontré esta solución que me permite tabular de columna en columna dentro de una fila y activar automáticamente el editor.

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

También tuve que poner en práctica la tabulación entre elementos de una tabla. Usamos Grid de Nebula como la tabla. En primer lugar, tuve que suprimir tabular el foco para evitar que salga de la mesa. enter image description here

y luego he añadido un detector de teclas que se mueve el foco/selección a la celda siguiente:

enter image description here

También hice mi propio algoritmo para mover la celda de la selección de la derecha y cuando al final de la fila, muévelo al comienzo de la siguiente fila. Cuando se llega al final de la tabla, la selección regresa a la primera celda de la tabla.

Esto me ha solucionado el problema.

Cuestiones relacionadas