以编程方式触发RCP选择事件

uı6*_*uɐp 23 java jface eclipse-rcp

在我的Eclipse RCP应用程序中,我使用了本文中描述的Selection Service .在一个视图中有一个TreeViewer注册为SelectionProvider:

getSite().setSelectionProvider(viewer);

另一个视图是从TreeViewer接收事件:

selectionListener = new ISelectionListener() {
  public void selectionChanged(IWorkbenchPart part, ISelection selection) {
    pageSelectionChanged(part, selection);
  }
 };
 getSite().getPage().addSelectionListener(selectionListener);
Run Code Online (Sandbox Code Playgroud)

一切正常,如果事件被触发我的正常鼠标点击.我想通过选择树中的项目以编程方式触发选择事件:

treeViewer.setSelection(new StructuredSelection(element),true);
Run Code Online (Sandbox Code Playgroud)

这不起作用.方法selectionChanged不在receiver-view中调用.这个论坛帖子讨论了这个问题.没有解决方案.

编辑

没有正确的方法来处理鼠标触发点击与编程选择相同的方式.单击鼠标可激活视图,而编程选择则不会.

我的解决方案是以与第一个视图相同的方式注册第二个Selection Service视图.之后,两个视图都直接从活动编辑器获取选择事件.

use*_*988 26

你可以做两件事:

1)进行选择,然后调用通知侦听器获取SWT.SELECTION即:

mybutton.setSelection(true);
mybutton.notifyListeners(SWT.Selection, new Event());
Run Code Online (Sandbox Code Playgroud)

notifyListener方法旨在用于自定义控件,所以更准确的是你可以选择2号选项.

2)调用你在监听器中调用的方法,即:

this.myButton.addSelectionListener(new SelectionListener() {
    public void widgetSelected(final SelectionEvent e) {
      doSomethingaboutTheSelMethod();
 }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以致电:

doSomethingaboutTheSelMethod();
Run Code Online (Sandbox Code Playgroud)


Lin*_*k19 6

我刚刚遇到这个问题并解决了这个问题:

treeViewer.getControl.setFocus();
treeViewer.setSelection(new StructuredSelection(element),true);
Run Code Online (Sandbox Code Playgroud)

在做出选择之前将焦点放在树上似乎会通知听众,而不是之前.


Kai*_*Kai 1

尝试做一个

treeViewer.fireSelectionChanged();
Run Code Online (Sandbox Code Playgroud)

或者

treeViewer.firePostSelectionChanged();
Run Code Online (Sandbox Code Playgroud)

设置选择后。


编辑

好吧,所以上面的调用不起作用...如果您足够绝望,您可以追踪源代码并找出实际调用的内容selectionChanged()。只需在您的方法中设置一个断点并启动堆栈即可。也许您知道如何以另一种方式实现此调用。