13

TableViewerコンテンツ プロバイダー、ラベル プロバイダー、ICellModifierおよびTextCellEditors各列で を使用しています。

ユーザーがセルを選択したときに矢印キー ナビゲーションとセル編集を追加するにはどうすればよいですか? できる限り自然な振る舞いでありたいと思います。

オンラインの例をいくつか見たところ、古い方法 ( を使用TableCursor) と新しい方法 ( ??TableCursorを混在させない) があるようです。CellEditors

現在、TableViewerカーソルがない場合、最初の列のみがスクロールされます。基になる SWT テーブルで、カーソルが null として表示されています。

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

(ドロップダウンテーブルセルの場合、上下ではなく左右の矢印をキャッチします。)

  • また、行全体が選択されているときに誰かが「return」を押した場合にセルの編集を開始することを目的とするのコントロールTraverseListenerにを追加します。TableViewer

    // 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()することになります(編集可能でない場合は、次の編集可能なメソッドにスキップできます)。

  • また、プログラムで「編集を放棄」できると便利だと思いました(たとえば、行の最後のセルからタブで移動する場合)。残念ながら、それを行うために私が思いつくことができる唯一の方法は、望ましい「副作用」を生み出すもののソースを調べて、私の特定のバージョンで動作することを決定したひどいハックです。

        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

ダブルクリックでエディターのアクティブ化を有効にする例をご覧ください

行間 [ 110 - 128 ] は、ColumnViewerEditorActivationStrategy と TableViewerEditor を追加します。私の場合、シングル クリックで編集を開始したかったので、115 行目を ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION から ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION に変更しました。これを私のTableViewerに追加した後、タブキーはエディターが有効になっているフィールドからフィールドへ移動します。

于 2011-08-24T21:01:18.880 に答える
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 に答える