【问题标题】:Save state between closening/opening intro part在关闭/打开介绍部分之间保存状态
【发布时间】:2012-12-06 13:00:28
【问题描述】:

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

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

@Override
public void saveState(IMemento memento) {
}

Here 表示当工作台关闭时,在所有打开的视图上调用方法saveState。但这只有在我关闭整个应用程序时才是正确的。

如果我只关闭这个页面而不是洞应用程序,我应该怎么做才能保存介绍页面状态?

【问题讨论】:

  • 调用saveState方法?
  • 调用 saveState 将是一个好主意,如果您弄清楚如何获取用于在工作台中保持状态的 IMemento 对象

标签: java eclipse eclipse-plugin eclipse-rcp


【解决方案1】:

您在常见问题解答中的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 指出此处不需要从文件加载或保存到文件。

【讨论】:

  • 你可以跳过“文件名”的东西。只需从插件激活器中检索设置,将其与 get/put 一起使用,并且当应用程序存在时(调用 Activator.stop() 时),设置将保持不变。
  • @fredrik 谢谢!我认为这里需要调用 save,因为 OP 想要在关闭部件后保存,而不是在应用程序退出后保存。但它实际上在不使用文件的情况下按预期工作。我更改了代码。
猜你喜欢
  • 1970-01-01
  • 2022-06-11
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 2011-09-12
相关资源
最近更新 更多