0

我有两个视图:一个带有 a TreeViewer,另一个带有 SWT 小部件。我希望带有小部件的视图中的活动能够导致带有TreeViewer. 在阅读有关该主题的各种资源时,他们都谈到了允许 JFace 查看器发出选择并接收通知,但他们没有谈到能够从文本小部件触发这些选择。

假设这段代码所在的视图是一个,我可以做这样的事情ISelectionProvider吗?

Text someText = new Text( parent, SWT.BORDER ) ;
someText.addKeyListener( new KeyListener() {
  @Override
  public void keyPressed( KeyEvent e ) {}

  @Override
  public void keyReleased( KeyEvent e ) {
    ...
    ...
    CellInfo cellInfo = new CellInfo( /*text collected while typing*/);
    currentSelection = new StructuredSelection( cellInfo ) ; 
    setSelection( currentSelection ) ;

...
...

public void setSelection( ISelection selection ) {
  Object[] list = getListeners() ;//listeners.getListeners();  
  for (int i = 0; i < list.length; i++) {  
    ((ISelectionChangedListener) list[i])  
     .selectionChanged(new SelectionChangedEvent(this, selection));  
  } 
}

这似乎在选择方面起作用,但在我想要使用选择的另一端,什么也没有发生。在该查看器中,我实现了ISelectionListener接口并在方法的开头执行以下操作createPartControl()

getSite().getPage().addSelectionListener(this);

但是该selectionChanged()方法永远不会被调用。

我的猜测是我在生产者方面做错了,因为消费者方面看起来很简单。任何指针?

谢谢!

乔恩

4

2 回答 2

3

您是否向 Workbench 介绍了您的选择提供商?在生产者方面,在您的 createPartControl() 中,您需要:

getSite().setSelectionProvider(this);
于 2011-05-20T15:47:03.570 回答
1

由于在整个 SWT 中应用的设计决策,通常不会发送事件以响应程序更改(与用户操作相反)。但是,您可以执行以下操作:

// (1) set a new selection for the view's viewer
myViewer.setSelection(ISelection, boolean);
// (2) setup event to be fired
// (2.1) create new org.eclipse.swt.widgets.Event
Event event = new Event();
// (2.2) set some fields in event
// e.g., event.widget = myViewer.getControl();
// (3) fire event via Viewer's Control (is Widget)
myViewer.getControl().notifyListeners(SWT.Selection, event);

但是请注意,这种方法会导致一个很好的机会(根据我自己的经验)。

于 2011-09-30T14:20:37.597 回答