Java 在SWT中获取活动Shell,即使Shell不在焦点上 代码>显示.GETActive SeHELL()/代码>似乎只考虑一个shell,如果它是聚焦的,它是活动的。如果此时另一个应用程序有焦点,这意味着Display.getActiveShell()返回null

Java 在SWT中获取活动Shell,即使Shell不在焦点上 代码>显示.GETActive SeHELL()/代码>似乎只考虑一个shell,如果它是聚焦的,它是活动的。如果此时另一个应用程序有焦点,这意味着Display.getActiveShell()返回null,java,windows,swt,Java,Windows,Swt,我需要一种方法,它可以告诉我哪一个是SWT应用程序上的Shell on focus,即使我的SWT应用程序不在focus上 我很快就将这段代码拼凑在一起,尽管有时我会得到一个AssertionException: public static Shell getActiveShell() { Display display = Display.getDefault(); Shell result = display.getActiveShell(); if (result

我需要一种方法,它可以告诉我哪一个是SWT应用程序上的Shell on focus,即使我的SWT应用程序不在focus上

我很快就将这段代码拼凑在一起,尽管有时我会得到一个
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;
}

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

最近,我遇到了一个类似的问题,尽管你可能同时找到了一个解决方案,但我想分享我的方法以供将来参考

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

“我需要一种方法,可以告诉我哪一个是SWT应用程序上的焦点Shell,即使我的SWT应用程序不在焦点上。”第二部分与第一部分相矛盾。你能澄清一下吗?一件事是让shell关注我的应用程序的上下文,另一件事是让我的swt应用程序关注焦点!如果应用程序本身没有焦点,那么应用程序中就没有焦点。必须有某个shell至少位于其他shell之上吗?典型的情况是,您有一个shell(或对话框或wtv),在它消失之前,不允许您在应用程序中单击任何其他shell。