即使Shell未处于焦点状态,也可以在SWT中获取Active Shell

时间:2013-05-14 11:32:10

标签: java windows swt

Display.getActiveShell()似乎只会将其视为有效的,如果它是专注的。如果此时另一个应用程序具有焦点,则表示Display.getActiveShell()返回null

我需要一个总是告诉我哪个是关注我的SWT应用程序的Shell的方法,即使我的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;
}

除了编写自己的方法之外,是否有任何标准方法可以解决此问题?

1 个答案:

答案 0 :(得分:9)

最近,我遇到了类似的问题,虽然您可能在此期间找到了解决方案,但我想与大家分享以供日后参考。

ShellActivationTracker添加了一个监听Activate事件的显示过滤器,如果激活的窗口小部件是Shell,则会记住最近激活的Shell。因此,即使您的应用程序当前未处于活动状态/焦点,您也可以查询(最后)活动shell。

  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;
      }
    }
  }