在松开/打开介绍部件之间保存状态

时间:2012-12-06 13:00:29

标签: java eclipse eclipse-plugin eclipse-rcp

我有Eclipse RCP应用程序。我自己的IntroPart扩展了org.eclipse.ui.part.IntroPart

通过继承我得到了这个方法:

@Override
public void saveState(IMemento memento) {
}

Here声明当工作台关闭时,会在所有打开的视图上调用方法saveState。但只有当我关闭整个应用程序时才会这样。

如果我只关闭此页面而非关闭孔应用程序,我应该怎么做才能保存介绍页面状态?

1 个答案:

答案 0 :(得分:3)

您的常见问题link回答:

  

持久化视图状态的另一种机制是JFace IDialogSettings工具。对话框设置优于视图保存/初始化机制的优点是您可以控制何时保持设置。

这是一个关于如何使用IDialogSettings在IntroPart关闭时保持其状态以及如何在创建时恢复它的示例。 MyIntroPart是一个具有Text小部件的IntroPart。关闭IntroPart时会保存显示的文本,并在创建时恢复。

要获取partClosed事件,MyIntroPart会实现IPartListener2并将自己注册到PartService。

private static final String MY_INTRO_SETTINGS = "my_intro_settings";
private static final String MY_INTRO_TEXT_KEY = "my_intro_text";

@Override
public void createPartControl(Composite parent) {
    this.text = new Text(parent, SWT.BORDER);

    // try to load the settings
    IDialogSettings settings = Activator.getDefault().getDialogSettings();
    IDialogSettings section = settings.getSection(MyIntroPart.MY_INTRO_SETTINGS);
    if (section != null) {
        // set the restored text string in the text widget
        this.text.setText(section.get(MyIntroPart.MY_INTRO_TEXT_KEY));
    }

    // register the part listener
    getIntroSite().getWorkbenchWindow().getPartService().addPartListener(this);
}

这会将文本还原到文本小部件。

MyIntroPart在视图关闭时实现IPartListener2的partClosed以保存对话框设置:

@Override
public void partClosed(IWorkbenchPartReference partRef) {
    // remove part listener from part service
    getIntroSite().getWorkbenchWindow().getPartService().removePartListener(this);

    IDialogSettings settings = Activator.getDefault().getDialogSettings();

    // get the section of the text
    IDialogSettings section = settings.getSection(MyIntroPart.MY_INTRO_SETTINGS);

    // if it doesn't exist, create it
    if (section == null) {
        section = settings.addNewSection(MyIntroPart.MY_INTRO_SETTINGS);
    }

    // put text from text field in section
    section.put(MyIntroPart.MY_INTRO_TEXT_KEY, this.text.getText());
}

感谢fredrik指出此处不需要加载或保存到文件中。