2016-07-11 14 views
3

TitleAreaDialogのクラスのタブ順からmessageLabel(画像の赤い矢印で強調表示)を削除する方法をお探しです。この問題を回避するには、現在、次のようになります。JFaceのTitleAreaDialogでタブ順からメッセージラベルを削除するには

getButton(IDialogConstants.CANCEL_ID).addTraverseListener(new TraverseListener() { 
    @Override 
    public void keyTraversed(TraverseEvent e) { 
    if (e.detail == SWT.TRAVERSE_TAB_NEXT) { 
     e.doit = false; 
     textUsername.forceFocus(); 
    } 
    } 
}); 

私の現在の回避策は、大文字と最下位の複合材料でTraverseEventをリッスンし、手動で正しい複合にフォーカスを強制することです。

しかし私は、製品のすべてのインスタンスについて、CommonTitleAreaDialogクラスで実装できるより一般的なソリューションを探しています。

enter image description here

+0

一般的な解決策では、トラバーサルリスナーの回避策を使用することはできますか? –

+0

@RüdigerHerrmann 'messageLabel'を囲むコンポジットにリスナーを置く必要があります(コードサンプルの編集を参照)。トラバースリスナーを使うときに何が考えられましたか(具体的には)? –

答えて

3

私はあなたのアプローチを一般化する2つの方法を参照してください。

  1. あなたが最後にTraverseListenerを追加することができますメッセージラベル

    getTitleImageLabel().getParent().setTabList(new Control[ 0 ]); 
    
  2. それとも同じ親を持つタイトル画像のラベルの親のタブ順序を操作しようとすることができます

    ボタンを移動し、最初のフォーカス可能なコントロールにジャンプするボタンバー(getButtonBar())のボタンをクリックします。最初のコントロールを見つけるには、createDialogArea()にフックし、戻ってくるコントロールから正しいコントロールを探し始めることができます。これらの線に沿って 何か:

    @Override 
    protected Control createDialogArea(Composite parent) { 
        Control startPoint = super.createDialogArea(parent); 
        Control firstControl = null; 
        if(startPoint instanceof Composite) { 
        Composite composite = (Composite)startPoint; 
        Control[] children = composite.getChildren(); 
        for(Control control : children) { 
         if((control.getStyle() & SWT.NO_FOCUS) == 0) { 
         firstControl = control; 
         break; 
         } 
        } 
        } 
        return parent; 
    } 
    

    はおそらく、コードは再帰的に最初の適切なコントロールを検索するように変更する必要があります。

両方がTitleAreaDialogを拡張し、ある程度、このクラスの実装の詳細に依存する必要があります。たとえば、タイトルイメージラベルに余分な親が与えられた場合、setTabList()は間違ったコンポジットで動作します。

関連する問題