Tab entre les champs dans TableViewer
Question
Ce que je voudrais faire est d'être en mesure d'onglet entre les éléments du tableau.
Je suis actuellement en train de créer ma table comme ça.
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 sais pas comment mettre en place la tabulation. Tout le reste fonctionne aussi loin que des colonnes d'édition, montrant des données, etc. Juste collé sur cette dernière partie.
Si j'ai oublié la documentation évidente ou javadocs -. Mes excuses et pointant même à ceux serait grand
La solution
Je pense par onglet par défaut ne saute pas de cellule à cellule dans une table de SWT. Au contraire, il parcourt le contrôle suivant. Donc, vous aurez également besoin de lui dire de ne pas traverser quand on appuie sur l'onglet
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.
Autres conseils
Bien que la solution thehiatus est affiché très bas niveau et probablement travailler (je ne l'ai pas testé), JFace vous donne un cadre pour ce problème spécifique. Voir la org.eclipse.jface.viewers.TableViewerFocusCellManager
ainsi que des cours de org.eclipse.jface.viewers.CellNavigationStrategy
pour résoudre ce problème.
Je ne pouvais pas obtenir le comportement souhaité avec un TraverseListener
(il ne traverserais dans le tableau), et j'eu du mal à travailler avec un FocusCellManager
et CellNavigationStrategy
. J'ai finalement trouvé cette solution qui me permet d'onglet d'une colonne à l'intérieur d'une ligne et 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);
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");
}}
);
Je devais aussi mettre en œuvre entre les éléments dans tabulant une table. Nous utilisons la grille de nébuleuse que la table.
Tout d'abord, je devais supprimer l'accent tabulant empêchant de se déplacer hors de la table.
et puis j'ai ajouté un écouteur de touche qui déplace le focus / sélection à la cellule suivante:
J'ai aussi fait mon propre algorithme pour déplacer la sélection d'une cellule à droite et quand à la fin de la ligne, le déplacer au début de la ligne suivante. Lorsque la fin du tableau est atteint, la sélection se déplace vers la première cellule de la table.
résolu le problème pour moi.