我正在开发Eclipse RCP应用程序,并且尝试根据MySourceProviderTableViewer上的选择更改来更新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.为什么当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
  }
});

关于java - 如何在TableViewer上收听选择更改?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33538508/

10-10 01:08