Я работаю над приложением Eclipse RCP, и я пытаюсь обновить значение выражения, которое предоставляется MySourceProvider
в соответствии с изменениями выбора на TableViewer
в MyEditorPart
.Как прослушать изменения выбора в TableViewer?
MyEditorPart
экземпляр определяет TableViewer
как это:
public class MyEditorPart extends EditorPart {
@Override
public void createPartControl(Composite parent) {
TableViewer tableviewer = new TableViewer(parent, SWT.CHECK);
tableviewer.setContentProvider(ArrayContentProvider.getInstance());
getSite().setSelectionProvider(tableViewer);
...
MySourceProvider
имеют некоторые значения выражения, как это:
public class MySourceProvider extends AbstractSourceProvider {
public static final String EXPR = "org.xyz.isEntrySelected";
// other expressions
@Override
public String[] getProvidedSourceNames() {
return new String[] { EXPR,
// other expressions
};
}
@Override
public Map getCurrentState() {
HashMap<String, Object> map = new HashMap<String, Object>(1);
map.put(EXPR, expr_value); // expr_value calculated by the listener
// other expressions
return map;
}
Я хочу изменить expr_value
в соответствии с изменениями отбора на TableViewer
. Я зарегистрировал слушателя, как это:
window.getSelectionService().addPostSelectionListener(MyEditorPartId, selectionListener);
private final ISelectionListener selectionListener = new SelectionListener() {
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
handleEvent();
}
};
Слушатель регистрируется успешно, но получает уведомление только один раз, если я нажал где-то на MyEditorPart
(не только TableViewer
, но и весь редактор). Чтобы получить уведомление снова, я должен щелкнуть по какой-либо другой части (или редактору), чтобы потерять фокус, а затем снова нажать на MyEditorPart
.
1. Почему слушатель получает уведомление только один раз, когда MyEditorPart
вновь получает фокус?
2. Как прослушивать только до выбора меняется на TableViewer
строк?
Что мне здесь не хватает? Каков правильный способ прослушивания изменений выбора?
Заранее спасибо.
Я понимаю, но я должен создать слушатель на другой классе 'MySourceProvider', именно поэтому я пытаюсь использовать' getSelectionService() .addPostSelectionListener() ', и этот метод принимает только' ISelectionListener'? Вместо этого, следует ли использовать ваше решение с EventBroker для уведомления 'MySourceProvider'? – emrekgn
Возможно, вам нужна простая функция обратного вызова. Старайтесь избегать излишних вещей с помощью трюков JFace. Если действие, на которое вы хотите ответить, - это «пользователь, который выбирает элемент в таблице», то вам нужен JCFListener. Из этого следует, что остальные просто используют ссылки и методы вызова, которые вы написали. –