如何关闭视图部件且不保存状态?适配Eclipse 3.8转4迁移需求
Eclipse 4.x 视图 saveState 行为适配 Eclipse 3.8 方案
要让Eclipse 4.x中视图的saveState(IMemento)仅在应用关闭时触发,而非单独关闭视图时执行,可以通过以下两种方式实现:
方法一:利用Eclipse 4生命周期事件统一控制
- 自定义生命周期处理器(Life Cycle Handler),监听应用关闭事件
UIEvents.UILifeCycle.APP_SHUTDOWN_STARTED。 - 视图内部缓存需要保存的状态,不依赖默认的
saveState方法处理单个视图关闭场景。 - 监听到应用关闭事件时,遍历所有活跃视图,主动调用自定义的状态保存方法,将状态写入
IMemento。
示例代码片段:
// 生命周期处理器类 @Execute public void handleShutdown(@EventTopic UIEvents.UILifeCycle.APP_SHUTDOWN_STARTED Event event, EModelService modelService, MApplication app) { List<MUIElement> views = modelService.findElements(app, null, MPart.class, null); for (MUIElement element : views) { if (element instanceof MPart part && part.getObject() instanceof MyView view) { IMemento memento = part.getPersistedState().get("memento"); if (memento != null) { view.customSaveState(memento); } } } }
视图类实现:
public class MyView extends ViewPart { private Object cachedState; @Override public void dispose() { // 缓存当前状态到cachedState变量 super.dispose(); } // 自定义保存方法,供应用关闭时调用 public void customSaveState(IMemento memento) { memento.putString("stateKey", cachedState.toString()); } }
方法二:重写视图销毁逻辑,拦截默认saveState调用
- 重写视图的
dispose方法,非应用关闭场景下跳过saveState执行。 - 注册应用关闭监听器,在应用退出时统一触发所有视图的
saveState。
示例:
public class MyView extends ViewPart { private boolean isAppShuttingDown = false; @Override public void init(IViewSite site) throws PartInitException { super.init(site); PlatformUI.getWorkbench().addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { isAppShuttingDown = true; IMemento memento = getViewSite().getState(); if (memento != null) { saveState(memento); } } }); } @Override public void dispose() { if (!isAppShuttingDown) { // 非应用关闭时,不执行saveState return; } super.dispose(); } }
注意:如果项目使用Eclipse 4的依赖注入(DI),可以通过@Inject获取IEventBroker监听关闭事件,替代传统的WindowListener,适配性更强。
内容的提问来源于stack exchange,提问作者Kildary Klein
相关产品推荐
相关产品推荐

