Как общаться между представлениями в Eclipse RCP?

В Eclipse RCP я создаю представления для перспективы, используя IPageLayout.addView(...)

Но таким образом у меня нет ссылки на представление. Поэтому я не знаю, как я могу сказать ViewA обновить ViewB.

Какой шаблон лучше всего использовать здесь?


person geejay    schedule 09.02.2010    source источник


Ответы (3)


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

  • Пусть ViewB реализует ISourceProviderListener
  • Создайте реализацию ISourceProvider и зарегистрируйте ее в сервисах
  • Попросите ViewA получить ISourceProvider и обновить его, чтобы активировать изменения в ViewB.

Прочтите документацию по этим интерфейсам вместе с IServiceLocator и ISourceProviderService, чтобы лучше понять, как все это работает.

Вы также можете ознакомиться с руководством Ларса Фогеля, в котором есть несколько примеров использования ISourceProvider

person DJ.    schedule 09.02.2010
comment
ISourceProviderListener: Я пропустил это. Тоже хорошее решение. +1. И теперь это будет Помимо того, что VonC упомянул ниже ;) - person VonC; 09.02.2010
comment
К сожалению, в e4 это уже не так. Больше никаких просмотров и редакторов, только... детали. Информацию о том, как работает связь между ними, сложно найти для e4. Для всех, кто ищет, это новое руководство, кажется, указывает путь. - person Amos M. Carpenter; 21.04.2016

В статье IBM< /а>

  • Чтобы представление могло прослушивать изменения выбора, представление должно реализовывать интерфейс ISelectionListener и должно регистрироваться на странице рабочей среды.
  • Использование интерфейса IAdaptable: класс, реализующий IAdaptable, имеет возможность динамически возвращать определенные типы адаптеров, которые затем можно использовать для получения дополнительной информации.
  • Парадигма слушателя изменения свойств

Что касается первого подхода, в статье подробно описано:

Более разумный способ использования выбора пользовательского интерфейса — зарегистрировать потребительские представления в качестве прослушивателей определенных частей представления. Как вы можете видеть в приведенном ниже примере, идентификатор представления исходной части представления упоминается в качестве параметра во время регистрации прослушивателя выбора.

  getSite().getPage().addSelectionListener("SampleViewId",(ISelectionListener)this);

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

Фрагмент кода в листинге 2 показывает метод createPartControl() представления, который создает JFace TableViewer и добавляет его в качестве поставщика выбора на сайт рабочей среды. Этот код позволяет любым изменениям выбора пользовательского интерфейса в TableViewer распространяться на страницу и, наконец, на заинтересованные потребительские представления.

Листинг 2. Настройка поставщика выбора

public void createPartControl(Composite parent) {
    // Set up a JFace Viewer
    viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
    viewer.setContentProvider(new ViewContentProvider());
    viewer.setLabelProvider(new ViewLabelProvider());
    viewer.setSorter(new NameSorter());
    viewer.setInput(getViewSite());

    // ADD the JFace Viewer as a Selection Provider to the View site.
    getSite().setSelectionProvider(viewer);

}

Вы найдете аналогичный подход в руководстве по RCP для eclipse3.5 (обновление от 4 февраля 2010 г.)

person VonC    schedule 09.02.2010

Существуют разные способы взаимодействия между представлениями и плагинами: eventbroker, listener и т. д.

Реализация EvenBroker (e4): используйте брокер событий для отправки сообщения (строки) между представлениями и плагинами.

Сторона отправителя:

@Inject
private IEventBroker eventBroker; 
private static final String STATUS ="status";
eventBroker.send(STATUS, "status test message..");

Сторона приемника:

@Inject
private IEventBroker eventBroker; 
private static final String STATUS ="status";
@Inject @Optional
public void  getEvent(@UIEventTopic(STATUS) String message) {
    ... //call method 
}
person OSezer    schedule 02.04.2016
comment
Я бы не стал дублировать переменную STATUS (просто иметь ее как public static final String и ссылаться на нее как от отправителя, так и от получателя), но в остальном это способ пойти в e4. Кстати, вы можете отправлять таким образом любой объект, а не только строки, и если вы хотите, чтобы это происходило асинхронно, используйте broker.post() вместо broker.send(). - person Amos M. Carpenter; 21.04.2016