2009-09-30 10 views
6

Co chciałbym zrobić, to móc między elementami w tabeli.Tab pomiędzy polami w TableViewer

Obecnie tworzę swój stół w ten sposób.

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

Ale nie jestem pewien, jak skonfigurować tabulację. Wszystko inne działa tak samo, jak edytowanie kolumn, pokazywanie danych itp. Po prostu utknąłem na tej ostatniej części.

Jeśli przegapiłem oczywistą dokumentację lub javadocs - moje przeprosiny, a nawet wskazanie tych byłoby wspaniałe.

+0

W jakim kierunku chcesz ustawić kartę? –

Odpowiedz

7

myślę przez zakładka domyślna nie skacze z komórki do komórki w tabeli swt. Zamiast tego przechodzi do następnej kontroli. Więc trzeba także poinformować go, aby nie przechodzić, gdy karta jest wciśnięty

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

Ponadto, jak sugeruje derBiggi, słuchacze muszą zostać dodane do obiektu tabeli, a nie TableViewer.

+0

Kod mógł zostać uproszczony, jeśli kod wyboru ("tableViewer.getTable() .setSelection (...)" w tym przykładzie) został umieszczony w gałęzi 'keyCode == SWT.TAB' TraverseListener'. To by zaoszczędziło dodatkowe 'KeyListener'. –

1

Trzeba dodać KeyListener i ustawić wybór lub skupić się na następnej komórki:

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 nie przyjmuje KeyListener –

+2

Nie wiem, czy to działa, ale tableViewer.getTable() powinien go zaakceptować. – derBiggi

+0

To był problem –

9

Mimo że opublikowane rozwiązanie thehiatus jest bardzo niskie i prawdopodobnie będzie działało (nie testowałem tego), JFace zapewnia ramy dla tego konkretnego problemu. Zobacz klasę org.eclipse.jface.viewers.TableViewerFocusCellManager wraz z klasami org.eclipse.jface.viewers.CellNavigationStrategy, aby rozwiązać ten problem.

+1

Jest to przydatny wskaźnik, ale odpowiedź byłaby przyjemniejsza dzięki przykładowemu kodowi lub objaśnieniu, w jaki sposób precyzyjnie z nich korzystać. – Kris

3

Nie mogłem uzyskać pożądanego zachowania za pomocą TraverseListener (nie przechodziło ono przez stół) i miałem problemy z uzyskaniem go do pracy z FocusCellManager i CellNavigationStrategy. W końcu znalazłem to rozwiązanie, które pozwala mi przechodzić od kolumny do kolumny w wierszu i automatycznie aktywować edytor.

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

miałem też wdrożyć tabulatorem pomiędzy elementami w tabeli. Używamy siatki z Mgławicy jako stołu. Po pierwsze, musiałem powstrzymać tabbing, aby nie dopuścić do wyprowadzenia ze stołu. enter image description here

a potem dodał Key Listener który przesuwa focus/wybór do następnej komórki:

enter image description here

I również mój własny algorytm, aby przesunąć zaznaczenie o jedną komórkę w prawo i kiedy na końcu wiersza, przenieś go na początek następnego wiersza. Po osiągnięciu końca tabeli wybór powraca do pierwszej komórki w tabeli.

To rozwiązało problem dla mnie.