我正在开发一个Eclipse应用程序,并试图根据MySourceProvider对TableViewer在MyEditorPart中的选择更改来更新由MyEditorPart提供的表达式值。
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.为什么当侦听器重新获得焦点时,侦听器只收到一次通知?
2.如何只听对TableViewer行的选择更改?
我在这里错过了什么?听选择变化的正确方法是什么?
提前谢谢。
发布于 2015-11-05 07:26:05
您需要的不是SelectionListener,而是SelectionChangedListener。
这样您就可以编写以下代码:
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = viewer.getStructuredSelection();
Object firstElement = selection.getFirstElement();
// do something with it
}
}); 发布于 2015-11-05 08:47:13
只有当部件处于活动状态时,这种形式的addPostSelectionListener才会触发。使用:
addPostSelectionListener(ISelectionListener listener)每次选择更改时调用的侦听器的形式。
然后,您可以在侦听器中测试IWorkbenchPart id:
@Override
public void selectionChanged(final IWorkbenchPart part, final ISelection selection)
{
if (MyEditorPartId.equals(part.getSite().getId()))
{
// your code
}
}https://stackoverflow.com/questions/33538508
复制相似问题