2009-04-02 12 views
13

Estoy usando un TableViewer con un proveedor de contenido, proveedor de etiquetas, un ICellModifier y TextCellEditors para cada columna.Usando Eclipse TableViewer, ¿cómo navego y edito las celdas con las teclas de flecha?

¿Cómo puedo agregar la navegación con la tecla de flecha y la edición de celda cuando el usuario selecciona la celda? Me gustaría que esto sea un comportamiento lo más natural posible.

Después de mirar algunos de los ejemplos en línea, parece haber una manera antigua (con un TableCursor) y una nueva forma (TableCursor no se combina con CellEditors ??).

Actualmente, mi TableViewer sin cursor se desplazará solo en la primera columna. La tabla SWT subyacente muestra el cursor como nulo.

¿Hay un buen ejemplo de TableViewer usando CellEditors y la navegación de la célula a través del teclado?

Gracias!

Respuesta

3

No sé si hay un buen ejemplo. Utilizo un clúster de código personalizado para obtener lo que consideraría comportamientos de tabla básicos para mi aplicación que funciona en la parte superior de TableViewer. (Tenga en cuenta que todavía estamos apuntan a 3.2.2 en este punto, así que tal vez las cosas han mejorado o han cambiado de otro modo.) Algunos aspectos destacados:

  • que hago en mi setCellEditors()TableViewer.
  • En cada control de CellEditor, establezco lo que considero un TraverseListener apropiado. Por ejemplo, para células de texto:

    cellEditor = new TextCellEditor(table, SWT.SINGLE | getAlignment()); 
    cellEditor.getControl().addTraverseListener(new TraverseListener() { 
        public void keyTraversed(TraverseEvent e) { 
         switch (e.detail) { 
         case SWT.TRAVERSE_TAB_NEXT: 
          // edit next column 
          e.doit = true; 
          e.detail = SWT.TRAVERSE_NONE; 
          break; 
    
         case SWT.TRAVERSE_TAB_PREVIOUS: 
          // edit previous column 
          e.doit = true; 
          e.detail = SWT.TRAVERSE_NONE; 
          break; 
    
         case SWT.TRAVERSE_ARROW_NEXT: 
          // Differentiate arrow right from down (they both produce the same traversal @*$&#%^) 
          if (e.keyCode == SWT.ARROW_DOWN) { 
           // edit same column next row 
           e.doit = true; 
           e.detail = SWT.TRAVERSE_NONE; 
          } 
          break; 
    
         case SWT.TRAVERSE_ARROW_PREVIOUS: 
          // Differentiate arrow left from up (they both produce the same traversal @*$&#%^) 
          if (e.keyCode == SWT.ARROW_UP) { 
           // edit same column previous row 
           e.doit = true; 
           e.detail = SWT.TRAVERSE_NONE; 
          } 
          break; 
         } 
        } 
    }); 
    

(para celdas de la tabla desplegables, capto la izquierda y flecha derecha en lugar de hacia arriba y hacia abajo.)

  • También agrego un TraverseListener al control TableViewer cuyo trabajo es comenzar la edición de celda si alguien golpea "regresar" mientras se selecciona una fila completa.

    // This really just gets the traverse events for the TABLE itself. If there is an active cell editor, this doesn't see anything. 
    tableViewer.getControl().addTraverseListener(new TraverseListener() { 
        public void keyTraversed(TraverseEvent e) { 
         if (e.detail == SWT.TRAVERSE_RETURN) { 
          // edit first column of selected row 
         } 
        } 
    }); 
    
  • Ahora, cómo es exactamente lo que controlan la edición es otra historia. En mi caso, mi entero TableViewer (y una representación de cada columna en él) está vagamente envuelto en un objeto personalizado con métodos para hacer lo que dicen los comentarios anteriores. Las implementaciones de esos métodos finalmente terminan llamando al tableViewer.editElement() y luego verificando tableViewer.isCellEditorActive() para ver si la celda era realmente editable (para que podamos pasar al siguiente editable si no es así).

  • También me pareció útil poder "cancelar" la edición mediante programación (por ejemplo, al eliminar tabuladores de la última celda de una fila).Por desgracia, la única manera en que podría llegar a hacer eso es un truco horrible decidido a trabajar con mi versión particular de la espeleología a través de la fuente de las cosas que producirían los "efectos secundarios" deseados:

    private void relinquishEditing() { 
         // OMG this is the only way I could find to relinquish editing without aborting. 
         tableViewer.refresh("some element you don't have", false); 
        } 
    

Lo siento, no puedo dar un fragmento más completo de código, pero realmente, tendría que lanzar todo un mini-proyecto de cosas, y no estoy preparado para hacer eso ahora. Espero que esto sea suficiente como un "salto inicial" para que empieces.

0

lo tengo trabajando en base a este JFace Snippet, pero tenía que copiar un par de clases relacionadas también:

  • org.eclipse.jface.snippets.viewers.TableCursor
  • org.eclipse.jface .snippets.viewers.CursorCellHighlighter
  • org.eclipse.jface.snippets.viewers.AbstractCellCursor

y yo no recuerdo exactamente donde los encontré. El también es un org.eclipse.swt.custom.TableCursor, pero no pude hacer que funcione.

0

Tenga una mirada en Example of enabling Editor Activation on a Double Click.

Las cosas entre líneas [110 - 128] añadir un ColumnViewerEditorActivationStrategy y TableViewerEditor. En mi caso, quería un solo clic para comenzar a editar, así que cambié la línea 115 de: ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION a ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION. Después de agregar esto a mi TableViewer, la tecla de tabulación iría de un campo a otro con el editor habilitado.

2

Aquí es lo que ha funcionado para mí:

TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(tableViewer,new FocusCellOwnerDrawHighlighter(tableViewer)); 
ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(tableViewer) { 
    protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) { 
     return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL 
      || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION         
      || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR) 
      || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC; 
     } 
}; 

puedo navegar en todas las direcciones con la lengüeta durante la edición, y la flecha alrededor cuando no está en modo de edición.

Cuestiones relacionadas