13

我将 aTableViewer与内容提供程序、标签提供程序、aICellModifierTextCellEditors用于每一列一起使用。

当用户选择单元格时,如何添加箭头键导航和单元格编辑?我希望这是一种尽可能自然的行为。

看了一些网上的例子后,似乎有一种旧的方式(与 a TableCursor)和一种新的方式(TableCursor不与CellEditors?? 混合)。

目前,TableViewer没有光标的 my 只会在第一列中滚动。底层 SWT 表显示游标为空。

有没有通过键盘TableViewer使用和单元格导航的好例子?CellEditors

谢谢!

4

4 回答 4

3

不知道有没有好的例子。我使用一组自定义代码来获取我认为是我的应用程序在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;
            }
        }
    });
    

(对于下拉表格单元格,我抓住左右箭头而不是上下箭头。)

  • 我还在 's 控件中添加了一个TraverseListenerTableViewer如果有人在选择整行时点击“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()单元格是否实际上是可编辑的(如果不是,我们可以跳到下一个可编辑的)。

  • 我还发现能够以编程方式“放弃编辑”很有用(例如,当跳出一行中的最后一个单元格时)。不幸的是,我能想出的唯一方法是一个可怕的 hack,它决定与我的特定版本一起工作,方法是深入研究会产生所需“副作用”的东西的源代码:

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

抱歉,我不能给出更完整的代码块,但实际上,我必须发布一个完整的迷你项目,而我现在不准备这样做。希望这足以让您继续前进。

于 2010-09-01T13:18:40.263 回答
2

这对我有用:

TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(tableViewer,new FocusCellOwnerDrawHighlighter(tableViewer));
ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(tableViewer) {
    protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
        return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL 
            || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION                                   
            || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR) 
            || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
       }
};

我可以在编辑时使用选项卡在各个方向导航,而在不处于编辑模式时可以使用箭头。

于 2012-11-30T18:58:36.447 回答
0

我让它基于这个JFace Snippet工作,但我还必须复制几个相关的类:

  • org.eclipse.jface.snippets.viewers.TableCursor
  • org.eclipse.jface.snippets.viewers.CursorCellHighlighter
  • org.eclipse.jface.snippets.viewers.AbstractCellCursor

我不记得我在哪里找到它们了。这也是一个 org.eclipse.swt.custom.TableCursor,但我无法让它工作。

于 2010-10-01T16:26:25.927 回答
0

查看在 双击时启用编辑器激活的示例。

行 [110 - 128] 之间的内容添加了 ColumnViewerEditorActivationStrategy 和 TableViewerEditor。在我的情况下,我想要单击开始编辑,所以我将第 115 行从:ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION 更改为 ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION。将此添加到我的 TableViewer 后,tab 键将在启用编辑器的情况下从一个字段转到另一个字段。

于 2011-08-24T21:01:18.880 回答