私の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();
私はちょうどこの問題を抱えていて、次のように解決しました:
treeViewer.getControl.setFocus();
treeViewer.setSelection(new StructuredSelection(element),true);
選択を行う前にツリーに焦点を合わせると、リスナーに通知するように見えましたが、以前はそうではありませんでした。
私も同じ問題を抱えていました。私が使用した回避策は、treeViewer.getTree().select(treeViewer.getTree().getItem(0));
メソッドを呼び出した後、プログラムでリスナーでイベントをトリガーすることでした。
ツリーに登録されているリスナーにクエリを実行し、リスナーへの参照を取得します。
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
}}}
SelectionEventを作成し、widgetSelectedメソッドを手動で呼び出して選択をトリガーします。
Event underlyingEvent = new Event();
underlyingEvent.widget = treeViewer.getTree();
SelectionEvent selectionEvent = new SelectionEvent(underlyingEvent);
((TreeSelectionListener)((TypedListener)listeners[i]).getEventListener()).widgetSelected(selectionEvent);
この解決策は私にとってはうまくいきました。それがあなたのためになることを願っています。
addPostSelectionListener
の代わりにaddSelectionListener
を試して、ワークベンチページでリスナーを登録してください。 StructuredViewer
のコードを見ると、プログラムで選択を設定するときに、前述のメソッドfirePostSelectionChanged
が呼び出されます。
パート(ビュー)にフォーカスがあることを確認してください!そうしないと、setSelectionは機能しません。
最初にクラスのPartServiceをInject
するか、コマンド実行メソッドのパラメーターとして追加します(EPartService partService
)次に、次の手順を実行します。
MPart myPart = partService.findPart(MyPart.ID);
partService.activate(myPart, true);
treeViewer.getControl().setFocus();
treeViewer.setSelection(new StructuredSelection(myObject), true);
やってみてください
_treeViewer.fireSelectionChanged();
_
または
_treeViewer.firePostSelectionChanged();
_
選択を設定した後。
[〜#〜]編集[〜#〜]
さて、上記の呼び出しは機能しません...十分に必死なら、ソースをトレースして、実際にselectionChanged()
を呼び出すものを見つけることができます。メソッドにブレークポイントを設定して、スタックを起動するだけです。たぶん、あなたは別の方法でこの呼び出しを達成する方法のアイデアを得るでしょう。
StructuredViewer.setSelection(ISelection, boolean)
は、次の場合を除いてSelectionChangedEvent
を起動します。
setSelection
を呼び出して無効なスレッドアクセスをスローした場合)。