6

我想做的是能够在表格中的元素之间进行制表符。

我目前正在像这样创建我的表。

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 - 我很抱歉,甚至指出这些都会很棒。

4

5 回答 5

9

尽管发布的中断解决方案级别非常低,并且可能会起作用(我还没有测试过),但 JFace 为您提供了针对此特定问题的框架。请参阅org.eclipse.jface.viewers.TableViewerFocusCellManager 伴随org.eclipse.jface.viewers.CellNavigationStrategy类来解决这个问题。

于 2009-10-09T14:43:35.930 回答
7

我认为默认情况下选项卡不会在 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);

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

于 2009-10-07T17:07:32.843 回答
3

我无法使用 a 获得所需的行为TraverseListener(它不会在表中遍历),并且我无法让它与 aFocusCellManager和一起使用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);
于 2016-02-29T04:03:20.807 回答
1

您需要添加一个 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");
   }}
);
于 2009-10-01T01:52:27.197 回答
0

我还必须在表格中的元素之间实现制表符。我们使用来自 Nebula 的 Grid 作为表格。首先,我必须抑制焦点以防止它移出桌子。 在此处输入图像描述

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

在此处输入图像描述

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

这为我解决了这个问题。

于 2016-07-04T12:33:22.410 回答