Вкладка между полями в TableViewer
Вопрос
Что я хотел бы сделать, так это иметь возможность вмешаться между элементами в таблице.
В настоящее время я так создаю свой стол.
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());
Но я не уверен, как настроить таблицу. Все остальное работает в отношении редактирования столбцов, показывающих данные и т. Д. Просто застряли в этой последней части.
Если бы я пропустил очевидную документацию или Javadocs - мои извинения и даже указание на них было бы здорово.
Решение
Я думаю, что по умолчанию вкладка не прыгает с ячейки к ячейке в таблице SWT. Вместо этого он проходит к следующему управлению. Таким образом, вам также нужно сказать, что он не проходит, когда нажата вкладка
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);
Кроме того, как предположил Дербигги, слушателей должны быть добавлены в объект таблицы, а не на TableViewer.
Другие советы
Хотя решение это Опубликовано очень низкий уровень и, вероятно, будет работать (я не тестировал его), JFACE дает вам основу для этой конкретной проблемы. Увидеть org.eclipse.jface.viewers.TableViewerFocusCellManager
вместе с org.eclipse.jface.viewers.CellNavigationStrategy
классы для решения этой проблемы.
Я не мог получить желаемое поведение с TraverseListener
(это не будет проходить в таблице), и у меня были проблемы с тем, чтобы заставить его работать с FocusCellManager
а также CellNavigationStrategy
. Анкет Я наконец нашел это решение, которое позволяет мне вступить из столбца до столбца в строке и автоматически активировать редактор.
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);
Вам нужно добавить KeyListener и установить выбор или сосредоточиться на следующей ячейке:
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");
}}
);
Мне также пришлось реализовать вкладки между элементами в таблице. Мы используем сетку из туманности в качестве таблицы. Во -первых, мне пришлось подавить вкладка фокуса, не позволяя ему выходить из стола.
А потом я добавил ключевого слушателя, который перемещает фокус/выбор в следующую ячейку:
Я также сделал свой собственный алгоритм, чтобы переместить отбор одной ячейки вправо, и когда в конце ряда переместите ее в начало следующего ряда. Когда достигнут конец таблицы, выбор возвращается к первой ячейке в таблице.
Это решило проблему для меня.