2009-09-30 7 views
6

Ce que je voudrais faire est de pouvoir tabuler entre les éléments de la table. Je suis actuellement en train de créer ma table comme ceci.Onglet entre les champs dans TableViewer

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

Mais je ne suis pas sûr comment configurer la tabulation. Tout le reste fonctionne aussi bien que l'édition de colonnes, l'affichage de données, etc. Juste coincé sur cette dernière partie.

Si j'ai manqué une documentation ou des javadocs évidents - mes excuses et même pointant vers ceux-ci serait génial.

+0

Dans quelle direction voulez-vous tabuler? –

Répondre

7

Je pense par onglet par défaut ne saute pas de cellule à cellule dans une table de SWT. Au lieu de cela, il passe au contrôle suivant. Donc, vous aurez également besoin de lui dire de ne pas traverser lorsque la patte est pressée

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

En outre, comme suggéré derBiggi, les auditeurs doivent être ajoutés à l'objet de la table, pas le TableViewer.

+0

Le code pourrait être simplifié si le code de sélection ('tableViewer.getTable(). SetSelection (...)' dans cet exemple) était placé dans la branche 'keyCode == SWT.TAB' de' TraverseListener'. Ceci épargnerait un 'KeyListener' supplémentaire. –

1

Vous devez ajouter un KeyListener et définir la sélection ou de se concentrer à la cellule suivante:

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 n'accepte pas un KeyListener –

+2

Ne sait pas si cela fonctionne, mais tableViewer.getTable() devrait l'accepter. – derBiggi

+0

C'était le problème –

9

Bien que la solution thehiatus affichée est de très bas niveau et fonctionnera probablement (je ne l'ai pas testé), JFace vous donne un cadre pour ce problème spécifique. Voir le org.eclipse.jface.viewers.TableViewerFocusCellManager avec org.eclipse.jface.viewers.CellNavigationStrategy classes pour résoudre ce problème.

+1

C'est un pointeur utile, mais la réponse serait plus agréable avec un exemple de code ou une explication sur la façon de les utiliser avec précision. – Kris

3

Je ne pouvais pas obtenir le comportement souhaité avec un TraverseListener (il ne traverserait pas dans la table), et j'ai eu du mal à le faire fonctionner avec un FocusCellManager et CellNavigationStrategy. J'ai finalement trouvé cette solution qui me permet de tabuler de colonne en colonne dans une rangée et d'activer automatiquement l'éditeur.

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

J'ai également dû implémenter des tabulations entre les éléments d'une table. Nous utilisons Grid from Nebula comme table. Premièrement, j'ai dû supprimer le tabulation de la mise au point pour l'empêcher de sortir de la table. enter image description here

puis j'ai ajouté un écouteur de touche qui déplace le focus/sélection à la cellule suivante:

enter image description here

J'ai aussi fait mon propre algorithme pour déplacer la sélection d'une cellule à droite et quand à la fin de la rangée, déplacez-le au début de la rangée suivante. Lorsque la fin de la table est atteinte, la sélection revient à la première cellule de la table.

Cela a résolu le problème pour moi.

Questions connexes