web-dev-qa-db-ja.com

プログラムでRCP選択イベントを発生させる

私のEclipseRCPアプリケーションでは、このニース 記事 で説明されているように選択サービスを使用します。 SelectionProviderとして登録された1つのビューにTreeViewerがあります。

getSite().setSelectionProvider(viewer);

別のビューは、TreeViewerからイベントを受信して​​います。

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

イベントが私の通常のマウスクリックでトリガーされれば、すべてが正常に機能します。ツリー内のアイテムを選択して、プログラムで選択イベントを発生させたいと思います。

treeViewer.setSelection(new StructuredSelection(element),true);

これは機能していません。メソッドselectionChangedはレシーバービューで呼び出されません。この問題については、この フォーラムスレッド で説明しています。解決策はありません。

[〜#〜]編集[〜#〜]

プログラムによる選択と同じように、マウスによってトリガーされるクリックを処理する適切な方法はありません。マウスをクリックすると、プログラムで選択したビューはアクティブになりません。

私の解決策は、最初のビューと同じ方法でSelection Serviceによって2番目のビューを登録することです。その後、両方のビューがアクティブなエディターから直接選択イベントを取得します。

あなたは2つのことをすることができます:

1)選択を行ってから、SWT.SELECTIONの通知リスナーを呼び出します。

mybutton.setSelection(true);
mybutton.notifyListeners(SWT.Selection, new Event());

NotifyListenerメソッドは、カスタムコントロールに使用することを目的としているため、より正確に言うと、オプション番号2を実行できます。

2)リスナーで呼び出すメソッドを呼び出します。

this.myButton.addSelectionListener(new SelectionListener() {
    public void widgetSelected(final SelectionEvent e) {
      doSomethingaboutTheSelMethod();
 }

この場合、次のように呼び出すことができます。

doSomethingaboutTheSelMethod();
28
user847988

私はちょうどこの問題を抱えていて、次のように解決しました:

treeViewer.getControl.setFocus();
treeViewer.setSelection(new StructuredSelection(element),true);

選択を行う前にツリーに焦点を合わせると、リスナーに通知するように見えましたが、以前はそうではありませんでした。

6
Link19

私も同じ問題を抱えていました。私が使用した回避策は、treeViewer.getTree().select(treeViewer.getTree().getItem(0));メソッドを呼び出した後、プログラムでリスナーでイベントをトリガーすることでした。

  1. ツリーに登録されているリスナーにクエリを実行し、リスナーへの参照を取得します。

    org.Eclipse.swt.widgets.Listener[] listeners = treeViewer.getTree().getListeners(SWT.Selection);
    for (int i=0; i<listeners.length; i++) {
            if (listeners[i] instanceof TypedListener) {
                if (((TypedListener)listeners[i]).getEventListener() instanceof TreeSelectionListener){
                      // Step 2: Fire the event code goes here
     }}}
    
  2. SelectionEventを作成し、widgetSelectedメソッドを手動で呼び出して選択をトリガーします。

    Event underlyingEvent = new Event();
    underlyingEvent.widget = treeViewer.getTree();
    SelectionEvent selectionEvent = new SelectionEvent(underlyingEvent);
    ((TreeSelectionListener)((TypedListener)listeners[i]).getEventListener()).widgetSelected(selectionEvent);
    

この解決策は私にとってはうまくいきました。それがあなたのためになることを願っています。

2
ALYS

addPostSelectionListenerの代わりにaddSelectionListenerを試して、ワークベンチページでリスナーを登録してください。 StructuredViewerのコードを見ると、プログラムで選択を設定するときに、前述のメソッドfirePostSelectionChangedが呼び出されます。

1
p12t

パート(ビュー)にフォーカスがあることを確認してください!そうしないと、setSelectionは機能しません。

最初にクラスのPartServiceをInjectするか、コマンド実行メソッドのパラメーターとして追加します(EPartService partService)次に、次の手順を実行します。

MPart myPart = partService.findPart(MyPart.ID);
partService.activate(myPart, true);
treeViewer.getControl().setFocus();
treeViewer.setSelection(new StructuredSelection(myObject), true);
1
Ray

やってみてください

_treeViewer.fireSelectionChanged();
_

または

_treeViewer.firePostSelectionChanged();
_

選択を設定した後。


[〜#〜]編集[〜#〜]

さて、上記の呼び出しは機能しません...十分に必死なら、ソースをトレースして、実際にselectionChanged()を呼び出すものを見つけることができます。メソッドにブレークポイントを設定して、スタックを起動するだけです。たぶん、あなたは別の方法でこの呼び出しを達成する方法のアイデアを得るでしょう。

1
Kai

StructuredViewer.setSelection(ISelection, boolean)は、次の場合を除いてSelectionChangedEventを起動します。

  • ビューアが選択を明示的に保持するコードを実行している(更新など)または
  • イベント通知を受け取る前に例外が発生します(たとえば、UI以外のスレッドからsetSelectionを呼び出して無効なスレッドアクセスをスローした場合)。
1
Martti Käärik