Pestaña entre campos en TableViewer
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.
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.
Y luego agregué un oyente clave que mueve el enfoque/selección a la siguiente celda:
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.