我希望TreeViewer
在 JFace 中同步两个 s。
我想第一步是首先准确理解是什么让滚动条出现。当我查看TreeViewer API时,我没有看到任何提到 ScrollBar 或任何子类或实现它的东西。
是什么定义它们并使它们出现在我的 TreeViewer 中(当我缩小窗口大小时)?
然后,如何在两棵树之间同步滚动?
我希望TreeViewer
在 JFace 中同步两个 s。
我想第一步是首先准确理解是什么让滚动条出现。当我查看TreeViewer API时,我没有看到任何提到 ScrollBar 或任何子类或实现它的东西。
是什么定义它们并使它们出现在我的 TreeViewer 中(当我缩小窗口大小时)?
然后,如何在两棵树之间同步滚动?
你试试这个:
((Tree) yourTreeView.getControl()).getHorizontalBar().setValue(...);
看一下 SWT“冻结列”片段- 显然,这是尽可能接近在所有平台上工作的 SWT 滚动位置同步。
请注意,SWT 只能以编程方式滚动到表项,因此您可能无法实现平滑滚动同步。
滚动条由底层的原生树小部件管理。您可以尝试通过将样式位传递给小部件构造函数来强制或禁用滚动条 - SWT.NO_SCROLL 应该禁用滚动条,SWT.H_SCROLL 和 SWT.V_SCROLL 应该始终显示相应的滚动条。请注意,这些标志只是提示——本机实现可能会忽略它们。
首先,您需要在TreeViewer 的树左右两侧的 VerticalScroll 栏上添加一个SelectionListener 。
leftTreeViewer.getTree().getVerticalBar().addSelectionListener(this);
rightTreeViewer.getTree().getVerticalBar().addSelectionListener(this);
然后在你的 widgetSelected(SelectionEvent e)
@Override
public void widgetSelected(SelectionEvent e)
{
if(e.getSource().equals(rightTreeViewer.getTree().getVerticalBar())){
onTreeVerticalScrollSelected(rightTreeViewer, leftTreeViewer);
}else if(e.getSource().equals(leftTreeViewer.getTree().getVerticalBar())){
onTreeVerticalScrollSelected(leftTreeViewer, rightTreeViewer);
}
}
private void onTreeVerticalScrollSelected(TreeViewer target, TreeViewer other){
other.getTree().getVerticalBar().setSelection(target.getTree().getVerticalBar().getSelection());
}
这在 linux 系统上对我来说非常顺利。