Подтвердить что ты не робот

Программно оставьте событие выбора RCP

В моем приложении RCP Eclipse я использую службу выбора, как описано в этом хорошем article. Существует TreeViewer в одном представлении, зарегистрированном как SelectionProvider:

getSite().setSelectionProvider(viewer);

Другое представление - получение событий из TreeViewer:

selectionListener = new ISelectionListener() {
  public void selectionChanged(IWorkbenchPart part, ISelection selection) {
    pageSelectionChanged(part, selection);
  }
 };
 getSite().getPage().addSelectionListener(selectionListener);

Все работает нормально, если события инициируются моими обычными щелчками мыши. Я хотел бы программно запускать события выбора путем выбора элемента в дереве:

treeViewer.setSelection(new StructuredSelection(element),true);

Это не работает. Выбор методаChanged не вызывается в представлении приемника. Этот вопрос обсуждается в этом форуме. Решение отсутствует.

EDIT

Нет правильного способа обработки щелчка мыши, как и программный выбор. Щелчок мышью активирует представление, которое программный выбор не делает.

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

4b9b3361

Ответ 1

Вы можете сделать две вещи:

1) выполните выбор, а затем вызовите уведомление слушателей для SWT.SELECTION, то есть:

mybutton.setSelection(true);
mybutton.notifyListeners(SWT.Selection, new Event());

Метод notifyListener предназначен для использования в пользовательских элементах управления, поэтому, чтобы быть более точным, вы можете сделать вариант номер 2.

2) вызовите метод, который вы вызываете в своем слушателе i.e.:

this.myButton.addSelectionListener(new SelectionListener() {
    public void widgetSelected(final SelectionEvent e) {
      doSomethingaboutTheSelMethod();
 }

В этом случае вы можете позвонить:

doSomethingaboutTheSelMethod();

Ответ 2

У меня была эта проблема и она была решена так:

treeViewer.getControl.setFocus();
treeViewer.setSelection(new StructuredSelection(element),true);

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

Ответ 3

Попробуйте сделать

treeViewer.fireSelectionChanged();

или

treeViewer.firePostSelectionChanged();

после установки выбора.


ИЗМЕНИТЬ

Хорошо, поэтому вышеупомянутые вызовы не работают... Если вы достаточно отчаянно, вы можете проследить через источники и узнать, что на самом деле вызывает selectionChanged(). Просто установите точку останова в своем методе и встаньте стек. Возможно, вы получите представление о том, как достичь этого вызова по-другому.

Ответ 4

Попробуйте addPostSelectionListener вместо addSelectionListener зарегистрировать слушателя на странице рабочего места. Если посмотреть на код StructuredViewer, упомянутый метод firePostSelectionChanged будет вызываться при программной настройке выбора.

Ответ 5

StructuredViewer.setSelection(ISelection, boolean) будет срабатывать SelectionChangedEvent, если только:

  • зритель выполняет код, который явно сохраняет выбор (например, обновление) или
  • возникает исключение, прежде чем оно получит уведомление о событии (например, когда вы вызываете setSelection из потока, отличного от UI, который вызывает недопустимый доступ к потоку).

Ответ 6

У меня была та же проблема. Обходной путь, который я использовал, заключался в том, чтобы инициировать событие на программном обеспечении Listener после вызова метода treeViewer.getTree().select(treeViewer.getTree().getItem(0));.

  • Запросить прослушиватели, зарегистрированные в дереве, и получить ссылку на слушателя:

    org.eclipse.swt.widgets.Listener[] listeners = treeViewer.getTree().getListeners(SWT.Selection);
    for (int i=0; i<listeners.length; i++) {
            if (listeners[i] instanceof TypedListener) {
                if (((TypedListener)listeners[i]).getEventListener() instanceof TreeSelectionListener){
                      // Step 2: Fire the event code goes here
     }}}
    
  • Создайте SelectionEvent и вызовите выбор, вручную вызвав метод widgetSelected:

    Event underlyingEvent = new Event();
    underlyingEvent.widget = treeViewer.getTree();
    SelectionEvent selectionEvent = new SelectionEvent(underlyingEvent);
    ((TreeSelectionListener)((TypedListener)listeners[i]).getEventListener()).widgetSelected(selectionEvent);
    

Это решение отлично работало для меня. Надеюсь, он это сделает для вас.

Ответ 7

Убедитесь, что ваша часть (вид) имеет фокус! В противном случае setSelection не будет работать.

Сначала Inject PartService в вашем классе или добавьте его как параметр в свой метод выполнения команды (EPartService partService), а затем выполните следующие действия:

MPart myPart = partService.findPart(MyPart.ID);
partService.activate(myPart, true);
treeViewer.getControl().setFocus();
treeViewer.setSelection(new StructuredSelection(myObject), true);