You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何关闭视图部件且不保存状态?适配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 00:05:02