Java RCP-应用程序没有活动窗口
在自定义服务中获取不过时的EPartService/EModelService/MapApplication引用的最佳方法是什么?我知道它可以通过@Execute方法在处理程序中完成,但我看不到在自定义服务类中实现它的方法。任何帮助都将不胜感激Java RCP-应用程序没有活动窗口,java,rcp,e4,Java,Rcp,E4,在自定义服务中获取不过时的EPartService/EModelService/MapApplication引用的最佳方法是什么?我知道它可以通过@Execute方法在处理程序中完成,但我看不到在自定义服务类中实现它的方法。任何帮助都将不胜感激 @Singleton @Creatable public class MyService { @Inject private EPartService partService; @Inject private EMode
@Singleton
@Creatable
public class MyService {
@Inject
private EPartService partService;
@Inject
private EModelService modelService;
@Inject
private MApplication application;
@Inject
public MyService(final IEclipseContext context) {
context.set(MyService.class.getName(), this);
}
public void doWork(){
// Application does not have an active window
}
}
使用活动叶上下文:
IEclipseContext activeContext = application.getContext().getActiveLeaf();
EPartService partService = activeContext.get(EPartService.class);
我认为模型和部件服务实际上没有改变,所以只使用application.getContext()
也应该可以
应用程序对象未更改。发生此问题的原因是,为每个窗口创建了EPartService,并且当您将服务注释为@Singleton EPartService时,仅将其注入到您的服务中一次,而当您更改窗口时,EPartService未更新。因此,删除注释@Singleton,一切都会好起来。感谢您的回复!当你说“我认为模型和部分服务实际上没有改变”和“应用程序对象没有改变”时,我有点困惑。你是说这些东西都不会过时吗?如果是这样,那么我的示例代码中的注入与您的代码中的活动叶之间的根本区别是什么?对于这些特定的服务,我认为没有区别。有些东西,如EHandlerService和EContextService,确实会发生变化,因此您需要为它们使用活动叶。这还取决于服务创建的时间有多早,如果是在应用程序启动完成之前,您可能无法注入所有内容。