如何在e4 UI启动运行后自动调用命令/操作?
嗨,我之前也碰到过类似的情况——照着生命周期教程加了注解却没效果,后来排查下来要么是配置没到位,要么是依赖缺了。给你两种靠谱的实现方式,你可以根据自己的情况选:
方法一:让生命周期注解生效(推荐)
如果想用@PostContextCreate这类生命周期注解,关键是要让E4容器识别到你的生命周期类:
创建生命周期类
写一个普通Java类,加上@PostContextCreate注解的方法(这个方法会在上下文创建完成、UI启动过程中执行,接近UI完全就绪的时机),如果要等UI完全启动完成,也可以用@ProcessAdditions:import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.core.di.annotations.PostContextCreate; import org.eclipse.swt.widgets.Display; import org.eclipse.e4.ui.workbench.modeling.EPartService; import org.eclipse.e4.ui.workbench.modeling.PartState; public class AppLifeCycle { @PostContextCreate public void onAppStartup(IEclipseContext context) { // 这里写你要执行的初始化操作 // 如果要操作UI组件,记得用UI线程包裹 Display.getDefault().asyncExec(() -> { // 比如打开指定视图、初始化控件状态等 EPartService partService = context.get(EPartService.class); partService.showPart("com.your.plugin.view.id", PartState.ACTIVATE); }); } }在application.e4xmi中配置生命周期类
打开你的application.e4xmi文件,找到根节点Application,在它的Life Cycle URI属性里,填入这个类的完整路径,格式是:platform:/plugin/你的插件ID/你的包路径/AppLifeCycle比如你的插件ID是
com.my.e4.app,类在com.my.e4.app.lifecycle包下,那就是platform:/plugin/com.my.e4.app/com/my/e4/app/lifecycle/AppLifeCycle检查依赖配置
确保你的插件MANIFEST.MF里添加了这些必要的依赖:org.eclipse.e4.core.diorg.eclipse.e4.ui.workbenchorg.eclipse.swt(如果涉及UI操作)
方法二:监听UI启动完成事件
如果注解方式还是不行,那就直接监听E4的UI启动完成事件,这个时机是UI完全就绪后的节点:
创建事件监听类
写一个类,通过IEventBroker订阅UIEvents.UILifeCycle.APP_STARTUP_COMPLETE事件:import javax.inject.Inject; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.core.services.events.IEventBroker; import org.eclipse.e4.ui.workbench.UIEvents; import org.eclipse.swt.widgets.Display; import org.eclipse.e4.ui.workbench.modeling.EPartService; import org.eclipse.e4.ui.workbench.modeling.PartState; import org.osgi.service.event.EventHandler; public class StartupCompleteHandler { @Inject private IEclipseContext context; @Inject public StartupCompleteHandler(IEventBroker eventBroker) { // 订阅UI启动完成事件 eventBroker.subscribe(UIEvents.UILifeCycle.APP_STARTUP_COMPLETE, getStartupHandler()); } private EventHandler getStartupHandler() { return event -> { // 确保在UI线程执行操作 Display.getDefault().asyncExec(() -> { // 这里写UI完全启动后要执行的逻辑 EPartService partService = context.get(EPartService.class); partService.showPart("com.your.plugin.view.id", PartState.ACTIVATE); }); }; } }将监听类添加到E4容器
打开application.e4xmi,找到Application下的Additions节点,右键选择Add->Bean,然后在Bean的Class URI属性里填入监听类的完整路径(格式和生命周期类一样),这样E4启动时会自动实例化这个类并订阅事件。检查依赖
除了方法一的依赖,还要添加org.eclipse.e4.core.services和org.osgi.service.event这两个bundle依赖。
这两种方法都能实现UI完全启动后自动执行操作,我个人更推荐第一种生命周期注解的方式,更符合E4的设计规范;如果注解始终不生效,事件监听的方式肯定能work。
内容的提问来源于stack exchange,提问作者ingo.mohr

