Pregunta

Lo que me gustaría hacer es poder atacar entre elementos en la tabla.

Actualmente estoy creando mi mesa 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 editar columnas, mostrando datos, etc., simplemente se quedó atrapado en esta última parte.

Si me he perdido la documentación obvia o los javadocs, mis disculpas e incluso señalarlas sería genial.

¿Fue útil?

Solución

Creo que, por defecto, la pestaña no salta de celda a celda en una tabla SWT. En su lugar, atraviesa al siguiente control. Por lo tanto, también deberá decirle que no atraviese cuando se presione 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);

Además, como sugirió Derbiggi, los oyentes deben agregarse al objeto de la tabla, no al TableViewer.

Otros consejos

Aunque la solución TheHiatus Publicado es de muy bajo nivel y probablemente funcionará (no lo he probado), JFace le brinda un marco para este problema específico. Ver el org.eclipse.jface.viewers.TableViewerFocusCellManager junto con org.eclipse.jface.viewers.CellNavigationStrategy clases para resolver este problema.

No pude obtener el comportamiento deseado con un TraverseListener (No atravesaría dentro de la mesa), y tuve problemas para que funcionara con un FocusCellManager y CellNavigationStrategy. Finalmente encontré esta solución que me permite pestaña de una 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);

Debe agregar un keylistener y establecer la selección o enfoque en la siguiente celda:

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

También tuve que implementar pestañas entre elementos en una tabla. Usamos la cuadrícula de la nebulosa como la mesa. En primer lugar, tuve que suprimir el enfoque que evitaba que se fuera de la mesa.enter image description here

Y luego agregué un oyente clave que mueve el enfoque/selección a la siguiente celda:

enter image description here

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

Esto resolvió mi problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top