1

私は SWT (JFace なし) で作業しており、サイドバーを使用しているツリーの動作をカスタマイズしようとしています。

ツリーの最上位の項目は選択できないようにする必要があります。それらは基本的にヘッダーです。これらのアイテムの子のみを選択可能にする必要があります。結果として、これを示す方法で UI を動作させたいと考えています。これらの最上位アイテムの 1 つをクリックすると、展開または縮小する必要がありますが、インジケーターの状態が変化し、子の可視性が変化する以外に、視覚的なフィードバックを提供するべきではありません。

問題は、OS X では、展開/折りたたみインジケーターが右または下を指す三角形 (画像か Unicode 文字かは不明) であり、「選択」状態に基づいて色付けされていることです。 . 矢印の色が変わることを除いて、トップレベルのアイテムに関連するすべての動作をオーバーライドすることができました。

  • SWT.EraseItem背景の色が変わらないように、リスナーを使用して背景の描画にフックしました。これは期待どおりに機能します。
  • リスナーを使用SWT.PaintItemして、最上位アイテムのテキストの色が変わらないようにしました。これは期待どおりに機能しますが、インジケーターに影響を与えていないようです。GC の前景色をリセットしないことも試みましたが、インジケーターの色は変わります。

未選択:

選択されていない

選択済み

選ばれ醜い

私がやろうとしたことのいくつかは、すべて失敗しました:

  • インジケーターの上に長方形を描くだけです。PaintListener を何にアタッチしても、インジケーターは常に一番上にあるようです。

  • Selection イベント タイプでリスナーを使用し、最上位の項目の 1 つであるかどうかを確認してからevent.item、イベント ビットと再描画フラグをいじります。これはまったくうまくいかないようです。動作は完全に予測不可能です。コードは次のようになります。

    sideBar.addListener(SWT.Selection, new Listener()
    {
        @Override
        public void handleEvent(Event event)
        {
            TreeItem eventItem = (TreeItem) event.item;
    
            if(sideBarRoots.contains(event.item))
            {
                event.detail = 0;
                event.type = 0;
                event.doit = false;
                sideBar.setRedraw(false);
            }
            else
            {
                sideBar.setRedraw(true);
                event.type = SWT.Selection;
                event.doit = true;
            }
        }
    });
    

    再描画フラグは単なるヒントであるため、適切に設定される場合と設定されない場合があります。効果がないか、サイドバーに何も再描画されない状態にロックされる可能性があります。

この動作の多くが、基礎となるネイティブ ウィジェットの動作と密接に関連していることは承知していますが、カスタム ウィジェットを最初からロールバックすることなく、探している動作を取得する方法があるかどうか疑問に思っていました。

4

1 に答える 1

3

あなたのような状況では、理想的にはツリーヘッダーでの選択を許可しないでください。

クリック可能にしないことで、選択イベントをキャンセルできます。しかし、それは特にキー ナビゲーションの場合、少しぎこちない実装になる可能性があります。

データで可能であれば、より安全なアプローチは、ツリーの親ノードが選択されるたびに選択を移動することです。したがって、親ノードがキーボードまたはマウスで選択されている場合、次のように機能するはずです。ノードを展開し、選択を最初の子に移動します。

このようにして、選択状態を非表示にするすべてのペイントトリックを回避できます。

于 2013-02-25T06:33:04.680 に答える