Программно оставьте событие выбора 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
как первое представление. После этого оба представления получают события выбора непосредственно из активного редактора.
Ответы
Ответ 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);