Как сохранить состояние просмотра дерева в приложении Java RCP?

У меня есть простое приложение RCP с парой мастеров, один из которых имеет средство просмотра дерева. Я хочу сохранить состояние выбранного элемента в средстве просмотра дерева в следующий раз, когда я открою это конкретное представление. На данный момент я реализовал с помощью статических переменных, и все работает нормально. Я хочу знать, как это можно сделать лучше?

//Образец кода

private static RepositoryLocationItem lastRepoItemSelected;

Composite parent=new Composite(SWT.NONE)
treeViewer = new TreeViewer(parent);
treeViewer.setContentProvider(new MovingBoxContentProvider());
treeViewer.setLabelProvider(new MovingBoxLabelProvider());
treeViewer.setInput(getInitalInput());

treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {

/* Setting the value of lastRepoItemSelected */
});


if(lastRepoItemSelected !=null)
{
treeViewer.setSelection(new StructuredSelection(lastRepoItemSelected),true); 
}

person Srikant Barik    schedule 09.11.2015    source источник
comment
Это RCP e4 или RCP, совместимый с 3.x (расширяет ли ваше представление ViewPart)?   -  person greg-449    schedule 09.11.2015
comment
Нет, это не распространяется на ViewPart. Это в основном страница мастера.   -  person Srikant Barik    schedule 10.11.2015
comment
Тогда это не вид, пожалуйста, используйте правильную терминологию.   -  person greg-449    schedule 10.11.2015


Ответы (1)


Предполагая, что это RCP в стиле 3.x (ваш вид расширяет ViewPart), вы можете использовать метод saveState для сохранения вашего состояния просмотра:

@Override
public void saveState(final IMemento memento)
{
  // TODO set values in the 'memento'
}

Затем вы можете использовать метод init для восстановления значений из памятки, когда представление снова отображается:

@Override
public void init(final IViewSite site, final IMemento memento)
  throws PartInitException
{
  super.init(site, memento);

  // TODO restore from 'memento'
}

Примечание. Сувениры сохраняются при перезапуске вашего RCP, поэтому вам необходимо хранить в них значения, действительные в новом экземпляре RCP.

Также см. вики-запись Eclipse для получения дополнительной информации.

Для WizardPage вы можете использовать IDialogSettings. Вы должны настроить это в своем Wizard, используя что-то вроде:

IDialogSettings pluginSettings = Activator.getDefault().getDialogSettings();
IDialogSettings wizardSettings = pluginSettings.getSection("id of your wizard");
if (wizardSettings == null) {
    wizardSettings= new DialogSettings("id of your wizard");
    pluginSettings.addSection(wizardSettings);
}
setDialogSettings(wizardSettings);

где Activator — это класс активатора вашего плагина, а «имя вашего мастера» — это идентификатор вашего мастера (который может быть любым, если он уникален в вашем плагине).

На странице мастера вы можете получить настройки с помощью:

IDialogSettings settings = getDialogSettings();

IDialogSettings имеет множество методов для сохранения и восстановления различных типов значений, таких как:

settings.put("key", "string value");

String value = settings.get("key");
person greg-449    schedule 09.11.2015
comment
, В моих реальных реализациях это распространяется из Wizard, а не из представления. Как этого можно достичь? - person Srikant Barik; 10.11.2015
comment
В Мастере вы используете IDialogSettings - добавлено в ответ - person greg-449; 10.11.2015
comment
Спасибо за комментарий. Это было полезно. Я пробовал с IDialogSettings, он работает нормально. Но он сохраняет значения даже после истечения сеанса. Я хочу что-то вроде статического, которое сохраняет значение только в течение сеанса и должно сбросить значение после сеанс истекает. - person Srikant Barik; 11.11.2015
comment
Все механизмы Eclipse, о которых я могу думать, предназначены для работы между сеансами. Я не думаю, что есть что-то лучше, чем статика для сеанса. - person greg-449; 11.11.2015
comment
Спасибо за поддержку. - person Srikant Barik; 11.11.2015