Swt 如何在Java RCP应用程序中保留treeviewer的状态?

Swt 如何在Java RCP应用程序中保留treeviewer的状态?,swt,eclipse-rcp,rcp,treeviewer,Swt,Eclipse Rcp,Rcp,Treeviewer,我有一个简单的RCP应用程序,它有两个向导,其中一个是树查看器。下次打开特定视图时,我希望在树查看器中保留所选项目的状态。到目前为止,我已经使用静态变量实现了,并且工作正常。我想知道如何以更好的方式实现它 //示例代码 private static RepositoryLocationItem lastprepoitemselected; 复合父项=新复合项(SWT.NONE) treeViewer=新的treeViewer(父级); setContentProvider(新的MovingBox

我有一个简单的RCP应用程序,它有两个向导,其中一个是树查看器。下次打开特定视图时,我希望在树查看器中保留所选项目的状态。到目前为止,我已经使用静态变量实现了,并且工作正常。我想知道如何以更好的方式实现它

//示例代码

private static RepositoryLocationItem lastprepoitemselected;
复合父项=新复合项(SWT.NONE)
treeViewer=新的treeViewer(父级);
setContentProvider(新的MovingBoxContentProvider());
setLabelProvider(新的MovingBoxLabelProvider());
setInput(getInitalInput());
treeViewer.addSelectionChangedListener(新的ISelectionChangedListener(){
/*设置lastRepoItemSelected的值*/
});
如果(lastRepoItemSelected!=null)
{
treeViewer.setSelection(新结构dselection(lastRepoItemSelected),true);
}

假设这是一个3.x样式的RCP(您的视图扩展了
ViewPart
),您可以使用
saveState
方法保存视图状态:

@覆盖
公共无效保存状态(最终IMemento memento)
{
//TODO在“memento”中设置值
}
然后,当视图再次显示时,可以使用
init
方法从memento恢复值:

@覆盖
公共无效初始(最终IViewSite站点、最终IMemento memento)
抛出PartInItemException
{
super.init(网站、纪念品);
//从“memento”恢复待办事项
}
注意:memento会在RCP的重启过程中持久化,所以您需要在其中存储在新的RCP实例中有效的值

有关更多信息,请参阅

对于
向导页面
,您可以使用
IDialogSettings
。您必须在
向导中设置此项,方法如下:

IDialogSettings pluginSettings=Activator.getDefault().getDialogSettings();
IDialogSettings wizardSettings=pluginSettings.getSection(“您的向导的id”);
如果(向导设置==null){
wizardSettings=新建对话框设置(“向导id”);
pluginSettings.addSection(向导设置);
}
setDialogSettings(向导设置);
其中,
Activator
是插件激活器类,“向导名称”是向导的id(只要它在插件中是唯一的,它可以是任何东西)

在向导页面中,您可以通过以下方式获得设置:

IDialogSettings设置=getDialogSettings();
IDialogSettings
有很多方法可以保存和恢复各种类型的值,例如:

settings.put(“键”、“字符串值”);
字符串值=settings.get(“key”);

假设这是一个3.x样式的RCP(您的视图扩展了
ViewPart
),您可以使用
saveState
方法保存视图状态:

@覆盖
公共无效保存状态(最终IMemento memento)
{
//TODO在“memento”中设置值
}
然后,当视图再次显示时,可以使用
init
方法从memento恢复值:

@覆盖
公共无效初始(最终IViewSite站点、最终IMemento memento)
抛出PartInItemException
{
super.init(网站、纪念品);
//从“memento”恢复待办事项
}
注意:memento会在RCP的重启过程中持久化,所以您需要在其中存储在新的RCP实例中有效的值

有关更多信息,请参阅

对于
向导页面
,您可以使用
IDialogSettings
。您必须在
向导中设置此项,方法如下:

IDialogSettings pluginSettings=Activator.getDefault().getDialogSettings();
IDialogSettings wizardSettings=pluginSettings.getSection(“您的向导的id”);
如果(向导设置==null){
wizardSettings=新建对话框设置(“向导id”);
pluginSettings.addSection(向导设置);
}
setDialogSettings(向导设置);
其中,
Activator
是插件激活器类,“向导名称”是向导的id(只要它在插件中是唯一的,它可以是任何东西)

在向导页面中,您可以通过以下方式获得设置:

IDialogSettings设置=getDialogSettings();
IDialogSettings
有很多方法可以保存和恢复各种类型的值,例如:

settings.put(“键”、“字符串值”);
字符串值=settings.get(“key”);

这是e4 RCP还是3.x兼容RCP(您的视图是否扩展了
ViewPart
)?不,它不是从ViewPart扩展的。它基本上是一个向导页面。那么它不是视图,请使用正确的术语。这是e4 RCP还是3.x兼容RCP(您的视图是否扩展了
ViewPart
)?不,它不是从ViewPart扩展而来。它基本上是一个向导页面。如果它不是视图,请使用正确的术语。,在我的实际实现中,它是从向导扩展而不是从视图扩展的。它是如何实现的?在向导中,您使用
IDialogSettings
-添加到应答中感谢您的评论。这很有帮助。我尝试了IDialogSettings,它工作正常。但它甚至在会话过期后仍在存储值。我想要一些类似于静态的东西,它只在在会话中存储值,并在会话过期后刷新该值。我能想到的所有Eclipse机制都是为跨会话而设计的。我认为在一个会话中没有什么比静态更好的了。感谢您的支持。非常感谢。,在我的实际实现中,它是从向导扩展而不是从视图扩展的。它是如何实现的?在向导中,您使用
IDialogSettings
-添加到应答中感谢您的评论。这很有帮助。我尝试了IDialogSettings,它工作正常。但它甚至在会话过期后仍在存储值。我想要一些类似于静态的东西,它只在在会话中存储该值,并在会话过期后刷新该值