2015-11-05 6 views
0

Я работаю над приложением 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 строк?

Что мне здесь не хватает? Каков правильный способ прослушивания изменений выбора?

Заранее спасибо.

ответ

1

Что вам нужно, это не SelectionListener, а SelectionChangedListener.

При этом вы можете написать следующий код:

viewer.addSelectionChangedListener(new ISelectionChangedListener() { 
    @Override 
    public void selectionChanged(SelectionChangedEvent event) { 
    IStructuredSelection selection = viewer.getStructuredSelection(); 
    Object firstElement = selection.getFirstElement(); 
    // do something with it 
    } 
}); 
+0

Я понимаю, но я должен создать слушатель на другой классе 'MySourceProvider', именно поэтому я пытаюсь использовать' getSelectionService() .addPostSelectionListener() ', и этот метод принимает только' ISelectionListener'? Вместо этого, следует ли использовать ваше решение с EventBroker для уведомления 'MySourceProvider'? – emrekgn

+0

Возможно, вам нужна простая функция обратного вызова. Старайтесь избегать излишних вещей с помощью трюков JFace. Если действие, на которое вы хотите ответить, - это «пользователь, который выбирает элемент в таблице», то вам нужен JCFListener. Из этого следует, что остальные просто используют ссылки и методы вызова, которые вы написали. –

0

Это действительно кажется, что эта форма addPostSelectionListener только пожары, когда часть становится активным. Используйте:

addPostSelectionListener(ISelectionListener listener) 

Форма слушателя, которая вызывается для каждого изменения выбора.

Вы можете проверить IWorkbenchPart идентификатор в слушателе:

@Override 
public void selectionChanged(final IWorkbenchPart part, final ISelection selection) 
{ 
    if (MyEditorPartId.equals(part.getSite().getId())) 
    { 
    // your code 
    } 
} 
+0

Я пробовал, но, к сожалению, у нее такая же проблема, она срабатывает только один раз. Простите мой глупый вопрос, но примеры, которые я нашел, всегда используйте этот механизм listenener - selectionprovider из 'ViewPart', интересно, имеет ли он какое-то отношение к использованию« EditorPart »?Потому что у меня есть некоторые классы «ViewPart», которые используют этот механизм, и они просто отлично работают. – emrekgn

+0

Это отлично работает для меня с помощью EditorPart –

Смежные вопросы