Eclipse plugin Eclipse在视图关闭时调用ViewPart saveState

Eclipse plugin Eclipse在视图关闭时调用ViewPart saveState,eclipse-plugin,savestate,memento,Eclipse Plugin,Savestate,Memento,我有一个Eclipse插件,它使用一个扩展了ViewPart的视图ViewPart有一个saveState方法,该方法需要IMemento 我将我的代码添加到saveState和相应的init方法中,它就工作了。不幸的是,只有在整个工作区关闭时才会调用saveState。我的观点并不是那么重要,我可以期待它一直被打开。因此,如果在视图关闭时调用saveState,那就太酷了 我发现一个视图部分监听器对视图闭包做出了反应,但我没有得到的是IMemento的来源。在哪里可以获得用于工作区闭包的mem

我有一个Eclipse插件,它使用一个扩展了
ViewPart
的视图
ViewPart
有一个
saveState
方法,该方法需要
IMemento

我将我的代码添加到
saveState
和相应的
init
方法中,它就工作了。不幸的是,只有在整个工作区关闭时才会调用
saveState
。我的观点并不是那么重要,我可以期待它一直被打开。因此,如果在视图关闭时调用
saveState
,那就太酷了

我发现一个视图部分监听器对视图闭包做出了反应,但我没有得到的是
IMemento
的来源。在哪里可以获得用于工作区闭包的memento对象?或者,如果视图(重新)打开,我必须在何处存储我自己的memento对象,以使视图部件在
init
方法中使用它


这是我的
saveState
-我能告诉我的视图在每次视图关闭时调用它吗?

好吧,这可能“有点”难看,但我没有想到其他事情:将memento变量存储为字段变量,在
init(IViewSite site,IMemento memento)中初始化它
方法,重写
dispose()
并明确地调用
saveState(IMemento memento)

您可以随时从
org.eclipse.core.runtime.Plugin.getStateLocation()读取和编写自己的XMLMemento。正如@BelaViser所提到的,您可以用
IViewPart#dispose()
方法编写文件,并在视图构造函数中读取它。

在Eclipse常见问题解答中查看这一点:

存储视图状态有两种常用方式,具体取决于 您希望在工作台会话之间或跨会话存储设置 调用您的视图。第一个这样的设施被发现了 直接在IViewPart上。当工作台关闭时,方法 对所有打开的视图调用saveState

另一种持久化视图状态的机制是JFace IDialogSettings设施。对话框设置相对于 view save/init机制是您可以控制何时更改设置的机制 坚持。仅当视图处于打开状态时,才会调用saveState方法 当工作台关闭时,它对存储视图没有用处 用户关闭视图时的状态。对话框设置,位于 另一方面,可以随时更改和保持


对于设置机制,请转到“其他”或“自身”。

能否提供您的保存状态方法刚刚遇到此问题,我得出结论,对于保存视图的状态,对话框设置效果最好,将记忆留给工作台保存视图大小,DialogSettings是从插件中简单检索的:Activator.getDefault().getDialogSettings()<在处置
小部件
后,可能会调用
视图
的code>dispose()
,导致出现
org.eclipse.swt.swt异常
:小部件在试图保存这些小部件的状态时被处置
@Override
public void saveState(IMemento memento) {
    super.saveState(memento);
    memento = memento.createChild(MEMENTO_GUI_STATE);
    memento.putBoolean(MEMENTO_IS_FLAT, !isHierarchicalModeActive());
    memento.putBoolean(MEMENTO_IS_CATEGORY_MODE_ACTIVE, comboViewer.isVisible());
}