2013-05-14 8 views
7

Display.getActiveShell()は、フォーカスされている場合、シェルをアクティブと見なしているようです。現時点で別のアプリケーションにフォーカスがある場合、Display.getActiveShell()nullを返します。シェルにフォーカスがない場合でもSWTのアクティブシェルを取得

SWTアプリケーションにフォーカスがないときでも、いつ私がSWTアプリケーションにフォーカスしているかを教えてくれるメソッドが必要です。時々私は得るものの

私はすぐに、一緒にコードのこの部分をハッキングしてきましたAssertionException

public static Shell getActiveShell() { 
    Display display = Display.getDefault(); 
    Shell result = display.getActiveShell(); 

    if (result == null) { 
     Shell[] shells = display.getShells(); 
     for (Shell shell : shells) { 
      if (shell.getShells().length == 0) { 
       if (result != null) 
        throw new AssertionException(); 
       result = shell; 
      } 
     } 
    } 

    return result; 
} 

独自のメソッドを書く以外に、この問題にアプローチする任意の標準的な方法はありますか?

+0

_ _第二部は、第一の矛盾は「私はいつも私のSWTアプリケーションがフォーカスにない場合でも、私のSWTアプリケーションに焦点を当て上のシェルである私に教えてくれます。メソッドが必要」。明確にすることはできますか? – Baz

+0

1つは、アプリケーションのコンテキストに焦点を当てたシェルを置くことです。もう1つは、私のswtアプリケーションに焦点を当てることです! –

+0

アプリケーション自体にフォーカスがない場合、アプリケーション内にフォーカスはありません。 – Baz

答えて

8

最近、同様の問題が発生しましたが、その間に解決策が見つかったものの、後で参考にしたいと思います。アクティブにウィジェットがShellある場合 - - 最近Shellを有効に覚えてShellActivationTracker

Activateイベントをリッスンし、表示フィルタを追加します。したがって、アプリケーションが現在アクティブ/フォーカスされていない場合でも、(最後の)アクティブなシェルを照会することができます。

class ShellActivationTracker implements Listener { 
    Shell activeShell; 

    ShellActivationTracker(Display display) { 
     activeShell = display.getActiveShell(); 
     display.addFilter(SWT.Activate, this); 
    } 

    @Override 
    public void handleEvent(Event event) { 
     if(event.widget instanceof Shell) { 
     activeShell = (Shell)event.widget; 
     } 
    } 
    } 
関連する問題