如何在TableViewer上收听选择更改?

时间:2015-11-05 07:07:25

标签: java eclipse-rcp jface rcp selectionchanged

我正在研究Eclipse RCP应用程序,我正在尝试根据MySourceProviderTableViewer的选择更改来更新MyEditorPart提供的表达式值。< / p>

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

我在这里缺少什么?听取选择变更的正确方法是什么?

提前致谢。

2 个答案:

答案 0 :(得分: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
  }
}); 

答案 1 :(得分:0)

看来这种形式的addPostSelectionListener仅在部件变为活动状态时触发。使用:

addPostSelectionListener(ISelectionListener listener)

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

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

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