2009-07-21 4 views
2

私は、キーリスナーを追加するカスタムTabFolder拡張を作成していて、ALT +#ホットキーを使用してタブをすばやく切り替えることができます。SWT、Key Listnerを追加するときにデフォルトのタブ順序を維持する

TabFolderにKeyAdapterを追加すると、タブヘッダーが選択されている場合(この場合、ALT + ARROW_LEFT/ARROW_RIGHTも機能します)、イベントハンドラが正しく機能します。 TabFolderを使ってウィジェットをアクティブにしたときにこのホットキーをアクティブにする必要があります。ただし、選択がタブフォルダの外にある別のタブフォルダまたはウィジェットにある場合は、アクティブではありません。

はこれを解決するために、私はタブのフォルダの子供たちのすべてにキーリスナーを適用するには、単純な再帰関数を書きました:

public void applyQuickSwitchKeyBindings() { 
    removeKeyListener(ka); 
     addKeyListener(ka); 
    for(Control c: getChildren()) 
     applyQuickSwitchKeyBindingsToChildren(c); 

    } 

private void applyQuickSwitchKeyBindingsToChildren(Control c) { 

    if(c==null) return; 
    if(c instanceof Composite) { 
     Control[] controls = ((Composite)c).getChildren(); 
     for(Control c2: controls) 
      applyQuickSwitchKeyBindingsToChildren(c2); 
     if(controls.length < 1) { 
      c.removeKeyListener(ka); 
      c.addKeyListener(ka); 
     } 
    } 
} 

その後、私は(applyQuickSwitchKeyBindingsを呼び出す)私が追加した後タブグループ内の各TabItemへのコントロール。

クイックスイッチホットキー(ALT +#)がうまくいったことがうれしかった!

悪い知らせは、z-indexに基づくオリジナルのTAB順序が今やなくなってしまったことです。あなたがあなたの現在のテキストボックスにフォーカスを失うと、何か他のものに焦点を獲得していないSWT.TABキーを押すと...

質問:

1)は、各コントロールは、一つだけのKeyListenerを持つことができますか?

2.)元のTABトラバーサルがもう機能しないのはなぜですか?

ありがとうございます!

答えて

0

〜1)私は、複数のKeyListenerが許可されていると確信しています。

〜2)私はあなたのKeyAdapterで何をしているかによって決まります。あなたもそれを投稿することができますか?

私はちょうどタブの順序が何とか壊れているので、setTabList(Control[])を呼び出してリセット(または変更)できます。

setTablList(new Control[] { 
    control1, 
    control2, 
    control3, 
    .... 
}); 
0

SWTで学習して開発する時間が増えたので、私の問題を発見しました。リスナーを追加すると、addXXXListener関数を呼び出すウィジェット/コントロールにリスナーが適用されます。そのコントロールがアクティブでない場合、リスナーは起動されません。

解決策は、グローバルアプリケーション(表示)スコープリスナーを追加できるSWTのグローバルフィルタメカニズムのようです。

Display.getCurrent().addFilter(SWT.keyPress, new KeyPressListener()); 

恩赦この行の不正確さが、あなたはそれをグーグル場合は、私が何を意味するかわかります。

これも控えめに読んでいます。

関連する問題