我正在创建eclipse RCP 4.x应用程序。应用程序包含多个视角。我想根据某些条件以编程方式打开默认透视图。下面的代码能够加载透视图。
@Execute
public void execute(MApplication app, EPartService partService,
EModelService modelService) {
MPerspective element =
(MPerspective) modelService.find("com.sanyotechnologyindia.desktop.app.perspective.enduser", app);
// now switch perspective
partService.switchPerspective(element);
}
但是我不能把这段代码放在用@PostContextCreate注释的方法中。 有人可以为此建议任何解决方案吗?
===== 根据Greg建议的解决方案,我尝试在Application Lifecycle类中使用代码。
@ProcessAdditions
void processAdditions(MApplication app, EPartService partService,
EModelService modelService){
MPerspective element =
(MPerspective) modelService.find("com.sanyotechnologyindia.desktop.app.perspective.usermanagement", app);
// now switch perspective
partService.switchPerspective(element);
}
现在我在第partServiceService.witchPerspective(element);
行中遇到以下错误java.lang.IllegalStateException:应用程序没有活动窗口
=====更新:================== 将org.eclipse.osgi.services插件添加到依赖项中。
@PostContextCreate
public void postContextContext(IEventBroker eventBroker)
{
eventBroker.subscribe(UIEvents.UILifeCycle.APP_STARTUP_COMPLETE,
new AppStartupCompleteEventHandler());
}
private class AppStartupCompleteEventHandler implements EventHandler
{
@Inject private MApplication app;
@Inject private EPartService partService;
@Inject private EModelService modelService;
@Override
public void handleEvent(Event arg0) {
MPerspective element =
(MPerspective) modelService.find("com.sanyotechnologyindia.desktop.app.perspective.usermanagement", app);
partService.switchPerspective(element);
}
}
但是现在框架无法在AppStartupCompleteEventHandler实例中注入MApplication,EPartService和EModelService。
答案 0 :(得分:1)
如果您只想在生命周期课程中执行此操作,请尝试使用@ProcessAdditions
方法而不是@PostContextCreate
。 @ProcessAdditions
在模型渲染之前的生命周期中稍后运行。
更新
即使@PostAdditions
进行一些UI操作还为时过早。您需要等待应用程序启动完成事件。您可以使用@PostContextCreate
方法中的事件代理订阅此事件:
@PostContextCreate
public void postContextContext(IEventBroker eventBroker)
{
eventBroker.subscribe(UIEvents.UILifeCycle.APP_STARTUP_COMPLETE,
new AppStartupCompleteEventHandler());
}
private class AppStartupCompleteEventHandler implements EventHandler
{
@Override
public void handleEvent(final Event event)
{
// TODO do UI operations here
}
}
EventHandler
是org.osgi.service.event.EventHandler
。
更新: 如果要在事件处理程序中使用注入,则必须使用`ContextInjectionFactory'创建处理程序:
EventHandler handler = ContextInjectionFactory.make(AppStartupCompleteEventHandler.class, context);
其中context
是IEclipseContext
。
注意:您不能将此用于非静态内部类,而是使用:
EventHandler handler = new AppStartupCompleteEventHandler();
ContextInjectionFactory.inject(handler, context);
此方法不支持构造函数的注入。