Guia Entre os campos no TableViewer
Pergunta
O que eu gostaria de fazer é poder guiar entre elementos na tabela.
Atualmente, estou criando minha mesa assim.
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());
Mas não tenho certeza de como configurar a tabulação. Todo o resto funciona até as colunas de edição, mostrando dados etc. Apenas preso nesta última parte.
Se eu perdi documentação óbvia ou javadocs - minhas desculpas e até apontar para elas seriam ótimas.
Solução
Eu acho que, por padrão, a guia não pula de célula em célula em uma tabela SWT. Em vez disso, ele atravessa o próximo controle. Portanto, você também precisará dizer para não atravessar quando a guia for pressionada
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);
Além disso, como sugeriu Derbiggi, os ouvintes precisam ser adicionados ao objeto da tabela, não ao TableViewer.
Outras dicas
Embora a solução thehiatus Postado é um nível muito baixo e provavelmente funcionará (eu não o testei), o JFFFE oferece uma estrutura para esse problema específico. Veja o org.eclipse.jface.viewers.TableViewerFocusCellManager
juntamente com org.eclipse.jface.viewers.CellNavigationStrategy
classes para resolver esse problema.
Eu não conseguia obter o comportamento desejado com um TraverseListener
(não atravessaria dentro da tabela), e eu tive problemas para fazê -lo funcionar com um FocusCellManager
e CellNavigationStrategy
. Finalmente, encontrei esta solução que me permite a guia de coluna para coluna dentro de uma linha e ativar automaticamente o 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);
Você precisa adicionar um KeyListener e definir a seleção ou focar na próxima célula:
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");
}}
);
Eu também tive que implementar a aba entre elementos em uma tabela. Usamos a grade da Nebula como a tabela. Em primeiro lugar, tive que suprimir o foco que o impedia de sair da mesa.
E então eu adicionei um ouvinte -chave que move o foco/seleção para a próxima célula:
Também fiz meu próprio algoritmo para mover a seleção de uma célula para a direita e, quando no final da linha, mova -a para o início da próxima linha. Quando o final da tabela é alcançado, a seleção volta para a primeira célula da tabela.
Isso resolveu o problema para mim.