我是Eclipse Plug-in Development的新手,并通过以下简单示例开发Eclipse插件。我需要根据用户是否不在当前的Eclipse工作台中来执行一些业务逻辑。
我正在尝试以下代码
PlatformUI.getWorkbench().addWindowListener(new IWindowListener() {
.........
@Override
public void windowDeactivated(IWorkbenchWindow arg0) {
// TODO Auto-generated method stub
.......
}
});
但即使打开任何向导/对话框,也会调用方法windowDeactivated
。我尝试了很多方法,但无法得到正确的解决方案。
请提供解决方案,因为我完全陷入困境,整个项目都是基于获得此问题的解决方案。
答案 0 :(得分:0)
我真的怀疑你的业务逻辑应该取决于工作台是否处于活动状态。
如果您不熟悉Eclipse插件开发,请花一些时间熟悉这些概念。
如果您仍然认为您需要知道工作台是否处于活动状态,您可以检查其任何外壳是否处于活动状态。
boolean isActive() {
Display display = PlatformUI.getWorkbench().getDisplay();
return display.getActiveShell() != null;
}
如果显示的外壳未处于活动状态, getActiveShell()
会返回当前有效的Shell
或null
。
答案 1 :(得分:0)
虽然由于维护和性能问题,不建议使用以下解决方案,但我使用以下解决方案来解决问题。
如果有更好的解决方案,请告诉我。
PlatformUI.getWorkbench().getActiveWorkbenchWindow().
getShell().getDisplay().addFilter
(SWT.FocusOut,new WindowDisplayListener());
public class WindowDisplayListener implements Listener{
@Override
public void handleEvent(Event event) {
//using a similar logic as provided by @Rüdiger Herrmann in the above post.
Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().
getShell().getDisplay().getActiveShell();
if(shell == null) //code for window inactive.
}
}
这个解决方案有一个小问题。只要用户从eclipse中的任何向导打开文件浏览器对话框,shell就会变为null。例如:如果用户打开文件浏览器以导入现有项目,则shell将变为空。
如果有其他解决方案,请告诉我。