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表中从一个单元格跳转到另一个单元格。 相反,它会遍历下一个控件。 因此,您还需要告诉它在按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); 

另外,正如derBiggi建议的那样,需要将侦听器添加到Table对象,而不是TableViewer。

尽管thehiatus发布的解决方案水平非常低并且可能会起作用(我还没有测试过),但JFace为您提供了解决此特定问题的框架。 请参阅org.eclipse.jface.viewers.TableViewerFocusCellManager以及org.eclipse.jface.viewers.CellNavigationStrategy类来解决此问题。

我无法使用TraverseListener获得所需的行为(它不会在表中遍历),并且我无法使用FocusCellManagerCellNavigationStrategy 。 我终于找到了这个解决方案,它使我能够在一行中从列到列进行选项卡并自动激活编辑器。

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

我还必须在表格中的元素之间实现标签。 我们使用来自星云的网格作为表格。 首先,我不得不压制焦点,防止其移出桌面。 在此处输入图像描述

然后我添加了一个Key Listener,它将焦点/选择移动到下一个单元格:

在此处输入图像描述

我还制作了自己的算法将选择一个单元格向右移动,当行结束时,将其移动到下一行的开头。 到达表的末尾时,选择将移回表中的第一个单元格。

这解决了我的问题。