Вкладка между полями в 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-мои извинения и даже указание на них было бы здорово.
5 ответов:
Я думаю, что по умолчанию tab не переходит из ячейки в ячейку в таблице swt. Вместо этого он переходит к следующему элементу управления. Поэтому вам также нужно будет сказать ему, чтобы он не пересекался, когда tab нажата
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);
Кроме того, как предположил дербигги, слушатели должны быть добавлены к объекту Table, а не к TableViewer.
Хотя решение thehiatus размещено на очень низком уровне и, вероятно, будет работать (я его не тестировал), 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);
Вам нужно добавить Кейлистенер и установить выделение или фокус на следующую ячейку:
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"); }} );
Мне также пришлось реализовать табуляцию между элементами в таблице. В качестве таблицы мы используем сетку из Туманности. Во-первых, я должен был подавить закладку фокуса, не давая ему выйти из стола.
А затем я добавил ключевой прослушиватель, который перемещает фокус / выделение в следующую ячейку:
Я также сделал свой собственный алгоритм, чтобы переместить выделение на одну ячейку вправо и, когда в конце строки, переместить его в начало следующей строки. Когда закончится когда таблица достигнута, выделение перемещается обратно в первую ячейку таблицы.
Это решило проблему для меня.