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.

Foi útil?

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.enter image description here

E então eu adicionei um ouvinte -chave que move o foco/seleção para a próxima célula:

enter image description here

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top