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

dev*_*ium 9 java windows swt

Display.getActiveShell()似乎只考虑一个Shell是活跃的,如果它的重点.如果此时另一个应用程序的焦点意味着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;
}
Run Code Online (Sandbox Code Playgroud)

除了编写自己的方法之外,有没有任何标准的方法来解决这个问题?

Rüd*_*ann 10

最近,我遇到了类似的问题,虽然你可能找到了一个解决方案,但我想与大家分享以供将来参考.

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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)