首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在TableViewer上收听选择更改?

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

Stack Overflow用户
提问于 2015-11-05 07:07:25
回答 2查看 2.3K关注 0票数 0

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

MyEditorPart实例定义如下所示的TableViewer

代码语言:javascript
复制
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具有如下表达式值:

代码语言:javascript
复制
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。我把听众注册如下:

代码语言:javascript
复制
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行的选择更改?

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

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2015-11-05 07:26:05

您需要的不是SelectionListener,而是SelectionChangedListener

这样您就可以编写以下代码:

代码语言:javascript
复制
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
  @Override
  public void selectionChanged(SelectionChangedEvent event) {
    IStructuredSelection selection = viewer.getStructuredSelection();
    Object firstElement = selection.getFirstElement();
    // do something with it
  }
}); 
票数 1
EN

Stack Overflow用户

发布于 2015-11-05 08:47:13

只有当部件处于活动状态时,这种形式的addPostSelectionListener才会触发。使用:

代码语言:javascript
复制
addPostSelectionListener(ISelectionListener listener)

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

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

代码语言:javascript
复制
@Override
public void selectionChanged(final IWorkbenchPart part, final ISelection selection)
{
  if (MyEditorPartId.equals(part.getSite().getId()))
   {
     // your code
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33538508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档