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