如何在TableViewer上侦听选择更改



我正在开发一个Eclipse RCP应用程序,并试图根据MyEditorPartTableViewer上的选择更改来更新MySourceProvider提供的表达式值。

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;
}

我想根据TableViewer上的选择更改来更改expr_value。我注册的听众是这样的:

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行的选择更改

我在这里错过了什么?倾听选择变化的正确方式是什么?

提前谢谢。

您需要的不是SelectionListener,而是SelectionChangedListener。

有了这个,你可以编写以下代码:

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

这种形式的addPostSelectionListener似乎只有在零件激活时才会触发。使用:

addPostSelectionListener(ISelectionListener listener)

侦听器的形式,每次选择更改都会调用它。

然后,您可以在侦听器中测试IWorkbenchPart id:

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

最新更新