以编程方式加载Eclipse RCP 4默认透视图

时间:2014-01-24 22:51:25

标签: java eclipse-rcp e4

我正在创建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。

1 个答案:

答案 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
  }
}

EventHandlerorg.osgi.service.event.EventHandler

更新: 如果要在事件处理程序中使用注入,则必须使用`ContextInjectionFactory'创建处理程序:

EventHandler handler = ContextInjectionFactory.make(AppStartupCompleteEventHandler.class, context);

其中contextIEclipseContext

注意:您不能将此用于非静态内部类,而是使用:

EventHandler handler = new AppStartupCompleteEventHandler();

ContextInjectionFactory.inject(handler, context);

此方法不支持构造函数的注入。