0

2 つのビューがあります。1 つTreeViewerは SWT ウィジェットを含み、もう 1 つは 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

選択プロバイダーについてワークベンチに伝えましたか? プロデューサー側では、 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 に答える