10

Display.getActiveShell()似乎只有在集中注意力时才认为 Shell 是活动的。如果此时另一个应用程序具有焦点,则意味着Display.getActiveShell()返回null

我需要一种方法,它总是会告诉我哪个是 Shell 关注我的 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;
}

除了编写自己的方法之外,还有什么标准方法可以解决这个问题吗?

4

1 回答 1

11

最近,我遇到了类似的问题,虽然您可能同时找到了解决方案,但我想分享我的,以供将来参考。

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;
    }
  }
}
于 2015-03-11T12:27:17.477 回答