Display.getActiveShell()
似乎只会将其视为有效的,如果它是专注的。如果此时另一个应用程序具有焦点,则表示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;
}
除了编写自己的方法之外,是否有任何标准方法可以解决此问题?
答案 0 :(得分:9)
最近,我遇到了类似的问题,虽然您可能在此期间找到了解决方案,但我想与大家分享以供日后参考。
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;
}
}
}