2009-04-02 6 views
13

J'utilise un TableViewer avec un fournisseur de contenu, un fournisseur d'étiquettes, un ICellModifier et TextCellEditors pour chaque colonne.Utilisation de Eclipse TableViewer, comment naviguer et modifier des cellules avec les touches fléchées?

Comment puis-je ajouter la navigation par touches fléchées et l'édition de cellule lorsque l'utilisateur sélectionne la cellule? Je voudrais que ce soit un comportement aussi naturel que possible.

Après avoir regardé quelques-uns des exemples en ligne, il semble y avoir une ancienne (avec un TableCursor) et une nouvelle façon (TableCursor ne se mélange pas avec CellEditors ??).

Actuellement, mon TableViewer sans curseur fera défiler dans la première colonne seulement. La table SWT sous-jacente affiche le curseur comme nul.

Existe-t-il un bon exemple de TableViewer utilisant CellEditors et la navigation cellulaire par clavier?

Merci!

Répondre

3

Je ne sais pas s'il y a un bon exemple. J'utilise un cluster de code personnalisé pour obtenir ce que je considère comme des comportements de table de base pour mon application qui fonctionne au-dessus de TableViewer. (Notez que nous ciblons toujours 3.2.2 à ce stade, alors peut-être les choses se sont améliorées ou ont changé autrement.) Quelques faits saillants:

  • je setCellEditors() sur mon TableViewer.
  • Sur chaque contrôle CellEditor, j'établis ce que je considère être un TraverseListener approprié. Par exemple, pour les cellules de texte:

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

(pour les cellules de table déroulantes, j'attraper flèches gauche et droite au lieu de haut en bas.)

  • -je ajouter aussi un TraverseListener au contrôle TableViewer dont le travail est de commencer la modification de la cellule si quelqu'un frappe "return" alors qu'une ligne entière est sélectionnée.

    // 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 
         } 
        } 
    }); 
    
  • Maintenant, comment exactement je contrôle l'édition est une autre histoire. Dans mon cas, mon entier TableViewer (et une représentation de chaque colonne qui s'y trouve) est librement enroulé dans un objet personnalisé avec des méthodes pour faire ce que disent les commentaires ci-dessus. Les implémentations de ces méthodes finissent par appeler tableViewer.editElement() puis en vérifiant tableViewer.isCellEditorActive() pour voir si la cellule était réellement éditable (ainsi nous pouvons passer à la suivante éditable si ce n'est pas le cas). J'ai également trouvé utile de pouvoir "abandonner l'édition" par programme (par exemple, en sortant de la dernière cellule d'une rangée).Malheureusement, la seule façon que je pouvais venir avec le faire est un terrible bidouille déterminé à travailler avec ma version particulière par spéléo à travers la source des choses qui produiraient les modes « effets secondaires »:

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

Désolé, je ne peux pas donner un morceau de code plus complet, mais vraiment, je devrais sortir un mini-projet complet, et je ne suis pas prêt à le faire maintenant. Espérons que cela suffise d'un "jumpstart" pour vous lancer.

0

Je l'ai travail basé sur ce JFace Snippet, mais je devais copier deux classes associées aussi:

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

et je ne me souviens pas exactement où je les ai trouvés. Le est également un org.eclipse.swt.custom.TableCursor, mais je n'ai pas réussi à le faire fonctionner.

0

Jetez un oeil à Example of enabling Editor Activation on a Double Click.

Les choses entre les lignes [110-128] ajouter un ColumnViewerEditorActivationStrategy et TableViewerEditor. Dans mon cas, je voulais un simple clic pour commencer à éditer donc j'ai changé la ligne 115 de: ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION à ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION. Après avoir ajouté ceci à TableViewer, la touche de tabulation passerait d'un champ à l'autre avec l'éditeur activé.

2

Voici ce qui a fonctionné pour moi:

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

Je peux naviguer dans toutes les directions avec onglet lors de l'édition, et la flèche autour lorsqu'ils ne sont pas en mode d'édition.

Questions connexes