2011-01-07 8 views
8

特定のウィジェットがisFocusControl()を使用してSWTでコントロールできるかどうかを確認できます。しかし、私の期待されるウィジェットにフォーカスがない場合、どのようにして(つまり、何が焦点をはずしたのか)を決定するにはどうすればよいですか?SWTのフォーカスの決定

トラバーサルリスナーでキーボードイベントを処理できるようになりましたが、マウスのクリックを使用してフォーカスを変更すると、アプリケーションが不思議に思えます。私は前の項目から焦点を当てた項目を見つける方法を見つけることができないようです。

また、フォーカスがマウスイベントによって変更された場合、FocusLostリスナ内から別のウィジェットにフォーカスを確実に設定することに問題があります。

提案がありますか?

答えて

12

それは次のとおりです、

Display.getFocusControl(); 
+0

OK、私はそれを試みました。これはコントロールを返すように見えます。フォーカスを持っているコントロールを読み込むためにtoString()を使用すると、単にText {}と表示されます。この機能からさらに詳細を得ることはできますか? – Zoot

+1

どのような詳細情報ですか?より詳細な情報を得るために、コントロールのゲッター関数を呼び出さないのはなぜですか? – Daniel

+0

または、getParent()関数を使用して、階層内のどこに収まるかを確認します。 – Daniel

2

としては説明Display.getFocusControl()コントロールにフォーカスがいるかを示します。ウィジェットに情報を関連付けるには、setData()メソッドを使用します。フォーカスを得る可能性があるすべてのコントロールでこれを行うことができます。そして、getData()は、どのコントロールにフォーカスがあるかを理解するのに役立ちます。

それ以外の場合は、作成したコントロールへのポインタを保持して、既知のコントロールポインタとの比較をします。いいえ?

1

getFocusControlはControlを返し、アイテムはControlから継承します。私はカスタムコントロールの束を使用して、私はフォーカスを持って取得するとき、私は実際にif(control instanceof myclass)ステートメントのセットを使用して実際にどのクラスを決定する(else ifs最初の後) その後、そのクラスにキャストし、私がクラスに入れた適切なゲッターメソッドを呼び出します。

希望、これはトリッキーなものですので、これは私が質問の後半部分について何かを追加してみましょう、

2

を支援します。

私も確実に別のウィジェットにフォーカスを設定することで問題を抱えていますフォーカスがマウスイベントによって変更された場合は、FocusLostリスナー内から移動します。

マウスでフォーカスを変更すると、マウスイベントはフォーカスイベントの後に処理されます。これにより、マウスイベントによってフォーカスイベントに適用されている変更が取り消されることがあります。

たとえば、テキストフィールドがマウスクリックによってフォーカスを取得した後にテキストフィールドの内容を選択するには、非同期呼び出しでイベントが送出されるまで選択を遅延させることができます。

textfield.addFocusListener(new FocusListener() {    
    @Override 
    public void focusLost(FocusEvent e) { 
    }   
    @Override 
    public void focusGained(FocusEvent e) { 
    Display.getCurrent().asyncExec(new Runnable() { 
     @Override 
     public void run() { 
     if (!textfield.isDisposed()) { 
      textfield.selectAll(); 
     } 
     } 
    }); 
    } 
}); 

非同期呼び出しがなければ、マウスイベントはフォーカスイベントで行われた選択を取り消します。