Display.getActiveShell()
似乎只有在获得焦点时才会将 Shell 视为 Activity 的。如果此时另一个应用程序获得焦点,则意味着 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;
}
除了编写您自己的方法之外,是否有解决此问题的标准方法?
最佳答案
最近,我遇到了类似的问题,虽然您可能同时找到了解决方案,但我想分享我的以供将来引用。
ShellActivationTracker
添加了一个显示过滤器,用于监听 Activate
事件,并且 - 如果激活的小部件是 Shell
- 记住最近激活的外壳
。因此,即使您的应用程序当前未处于 Activity/焦点状态,您也可以查询(最后一个) Activity 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;
}
}
}
关于java - 在 SWT 中获取 Active Shell,即使 Shell 不在焦点上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16542066/