我建议为每棵树添加一个焦点侦听器,并用当前集中的树查看器调用partSite.setSelectionProvider()
。例如:
treeViewer1.getTree().addListener(SWT.FocusIn, event -> site.setSelectionProvider(treeViewer1));
treeViewer2.getTree().addListener(SWT.FocusIn, event -> site.setSelectionProvider(treeViewer2));
我将把它留作练习,以便读者移除侦听器重复。
或者,您可以创建代理选择提供程序,该选择提供程序在两个树查看器中侦听选择更改并传播最近的选择。沿着这些路线的东西:
public class ProxySelectionProvider implements ISelectionProvider {
private ISelection selection;
private final Collection<ISelectionChangedListener> listeners;
public ProxySelectionProvider(StructuredViewer... viewers) {
listeners = new ArrayList<>();
selection = StructuredSelection.EMPTY;
for(StructuredViewer viewer : viewers) {
ISelectionChangedListener selectionListener = this::selectionChanged;
viewer.addSelectionChangedListener(selectionListener);
viewer.getControl().addDisposeListener(event -> viewer.removeSelectionChangedListener(selectionListener));
}
}
@Override
public void addSelectionChangedListener(ISelectionChangedListener listener) {
listeners.add(listener);
}
@Override
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
listeners.remove(listener);
}
@Override
public ISelection getSelection() {
return selection;
}
@Override
public void setSelection(ISelection selection) {
this.selection = selection;
}
private void selectionChanged(SelectionChangedEvent event) {
selection = event.getSelection();
notifyListeners();
}
private void notifyListeners() {
SelectionChangedEvent event = new SelectionChangedEvent(this, selection);
new ArrayList<>(listeners).forEach(listener -> listener.selectionChanged(event));
}
}
使用选择供应商是这样的:
ISelectionProvider selectionProvider = new ProxySelectionProvider(treeViewer1, treeViewer2);
IWorkbenchPartSite partSite = workbenchWindow.getActivePage().getActivePart().getSite();
partSite.setSelectionProvider(selectionProvider);
我看到你是新来的SO。如果您觉得答案可以解决问题,请点击绿色复选标记将其标记为“已接受”。这有助于将重点放在仍然没有答案的旧帖子上。 –