2009-04-02 2 views
13

Я использую TableViewer с поставщиком контента, поставщиком ярлыков, ICellModifier и TextCellEditors для каждого столбца.Использование Eclipse TableViewer, как мне перемещаться и редактировать ячейки со стрелками?

Как добавить навигацию по клавишам со стрелкой и редактирование ячеек, когда пользователь выбирает ячейку? Я бы хотел, чтобы это было как можно более естественным.

После глядя на некоторых из онлайн примеров, кажется, есть старый способ (с TableCursor) и новым способ (TableCursor не смешивается с CellEditors ??).

В настоящее время мой TableViewer без курсора будет прокручиваться только в первом столбце. В базовой таблице SWT отображается курсор как нуль.

Есть ли хороший пример TableViewer с использованием CellEditors и сотовой навигации по клавиатуре?

Спасибо!

ответ

3

Я не знаю, если есть хороший пример. Я использую кластер пользовательского кода, чтобы получить то, что я считаю основным поведением таблицы для моего приложения, работающего над TableViewer. (Обратите внимание, что мы по-прежнему ориентируемся 3.2.2 на данный момент, так что, возможно, все стало лучше или иначе изменилось.) Некоторые основные моменты:

  • я setCellEditors() на моем TableViewer.
  • В каждом управлении CellEditor я устанавливаю то, что считаю подходящим TraverseListener. Например, для текстовых ячеек:

    cellEditor = new TextCellEditor(table, SWT.SINGLE | getAlignment()); 
    cellEditor.getControl().addTraverseListener(new TraverseListener() { 
        public void keyTraversed(TraverseEvent e) { 
         switch (e.detail) { 
         case SWT.TRAVERSE_TAB_NEXT: 
          // edit next column 
          e.doit = true; 
          e.detail = SWT.TRAVERSE_NONE; 
          break; 
    
         case SWT.TRAVERSE_TAB_PREVIOUS: 
          // edit previous column 
          e.doit = true; 
          e.detail = SWT.TRAVERSE_NONE; 
          break; 
    
         case SWT.TRAVERSE_ARROW_NEXT: 
          // Differentiate arrow right from down (they both produce the same traversal @*$&#%^) 
          if (e.keyCode == SWT.ARROW_DOWN) { 
           // edit same column next row 
           e.doit = true; 
           e.detail = SWT.TRAVERSE_NONE; 
          } 
          break; 
    
         case SWT.TRAVERSE_ARROW_PREVIOUS: 
          // Differentiate arrow left from up (they both produce the same traversal @*$&#%^) 
          if (e.keyCode == SWT.ARROW_UP) { 
           // edit same column previous row 
           e.doit = true; 
           e.detail = SWT.TRAVERSE_NONE; 
          } 
          break; 
         } 
        } 
    }); 
    

(для ячеек таблицы раскрывающихся, я ловлю влево и стрелка вправо, а не вверх и вниз.)

  • Я также добавить TraverseListener к элементу управления TableViewer, задача которого - начать редактирование ячейки, если кто-то нажимает «return», пока выбрана целая строка.

    // This really just gets the traverse events for the TABLE itself. If there is an active cell editor, this doesn't see anything. 
    tableViewer.getControl().addTraverseListener(new TraverseListener() { 
        public void keyTraversed(TraverseEvent e) { 
         if (e.detail == SWT.TRAVERSE_RETURN) { 
          // edit first column of selected row 
         } 
        } 
    }); 
    
  • Теперь как именно я контролирую редактирование другая история. В моем случае все мое TableViewer (и представление каждого столбца в нем) свободно обернуто в пользовательский объект с помощью методов, чтобы сделать то, что говорят выше. Реализации этих методов в конечном итоге заканчиваются вызовом tableViewer.editElement(), а затем проверка tableViewer.isCellEditorActive(), чтобы увидеть, действительно ли ячейка была доступна для редактирования (поэтому мы можем перейти к следующей редактируемой, если нет).

  • Я также счел полезным использовать программный «отказ от редактирования» (например, при переходе из последней ячейки в строке).К сожалению, единственный способ, которым я мог придумать, чтобы сделать это ужасный хак решимости работать с моей конкретной версии, спелеология через источник для вещей, которые будут производить желаемые «побочные эффекты»:

    private void relinquishEditing() { 
         // OMG this is the only way I could find to relinquish editing without aborting. 
         tableViewer.refresh("some element you don't have", false); 
        } 
    

Извините, я не могу дать более полный кусок кода, но на самом деле мне придется выпустить целый мини-проект, и я не готов это делать сейчас. Надеюсь, этого достаточно, чтобы начать прыгать.

0

Я получил это работает на основе этого JFace Snippet, но я должен был скопировать пару смежных классов также:

  • org.eclipse.jface.snippets.viewers.TableCursor
  • org.eclipse.jface .snippets.viewers.CursorCellHighlighter
  • org.eclipse.jface.snippets.viewers.AbstractCellCursor

и я не помню точно, где я нашел их. Это также org.eclipse.swt.custom.TableCursor, но я не мог заставить это работать.

0

Посмотрите Example of enabling Editor Activation on a Double Click.

материал между линиями [110 - 128] добавить ColumnViewerEditorActivationStrategy и TableViewerEditor. В моем случае мне потребовался один щелчок, чтобы начать редактирование, поэтому я изменил строку 115 с: ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION на ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION. После добавления этого в мой TableViewer ключ вкладки переместился из поля в поле с включенным редактором.

2

Вот что работает для меня:

TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(tableViewer,new FocusCellOwnerDrawHighlighter(tableViewer)); 
ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(tableViewer) { 
    protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) { 
     return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL 
      || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION         
      || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR) 
      || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC; 
     } 
}; 

Я могу перемещаться во всех направлениях вкладке во время редактирования, и стрелка, если оно не находится в режиме редактирования.