Java 在SWT中获取活动Shell,即使Shell不在焦点上 代码>显示.GETActive SeHELL()/代码>似乎只考虑一个shell,如果它是聚焦的,它是活动的。如果此时另一个应用程序有焦点,这意味着Display.getActiveShell()返回null
我需要一种方法,它可以告诉我哪一个是SWT应用程序上的Shell on focus,即使我的SWT应用程序不在focus上 我很快就将这段代码拼凑在一起,尽管有时我会得到一个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
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。