Используя Eclipse TableViewer, как мне перемещаться и редактировать ячейки с помощью клавиш со стрелками? - PullRequest
13 голосов
/ 02 апреля 2009

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

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

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

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

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

Спасибо!

Ответы [ 5 ]

3 голосов
/ 01 сентября 2010

Я не знаю, есть ли хороший пример. Я использую кластер пользовательского кода, чтобы получить то, что я считаю базовым поведением таблиц для моего приложения, работающего поверх 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);
        }
    

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

2 голосов
/ 30 ноября 2012

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

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

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

0 голосов
/ 25 августа 2011

Посмотрите на Пример включения активации редактора при двойном щелчке.

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

0 голосов
/ 01 октября 2010

Я получил его на основе этого 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 голосов
/ 25 июня 2009
...