我有两个ScrolledComposite,并且正在像这样同步它们的垂直滚动位置:

final ScrollBar vScroll1 = canvasScroll.getVerticalBar();
final ScrollBar vScroll2 = titleScroll.getVerticalBar();

vScroll1.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent e) {
        titleScroll.setOrigin(titleScroll.getOrigin().x, canvasScroll.getOrigin().y);
    }
});

vScroll2.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent e) {
        canvasScroll.setOrigin(canvasScroll.getOrigin().x, titleScroll.getOrigin().y);
    }
});

除显示两个ScrolledComposites的滚动条外,此方法工作正常。我只希望一个ScrolledComposite的滚动条可见,因此我将其可视性之一设置为false:
vScroll2.setVisible(false);

这没有作用。我也尝试不使用ScrolledComposite标志实例化SWT.V_SCROLL,但这在运行上述代码时导致空指针异常。滚动条确实需要存在,我只是希望它不可见。那可能吗?

最佳答案

简单回答是不”。

如果您创建的ScrolledComposite没有SWT.H_SCROLLSWT.V_SCROLL,则无法滚动它,即,调用setOrigin(Point)或相关方法根本无法执行任何操作。

另一方面,如果启用了滚动条,但要隐藏它们,则操作系统将覆盖您的决定。滚动条由操作系统控制,这意味着操作系统将决定它们是否可见。在setVisible(false)上调用ScrollBar只是对操作系统的提示。可能会跟着它走...

很抱歉成为坏消息的承担者:\

您可以尝试将ScrolledComposite包装在另一个Composite中,并迫使其将“ScrolledComposite”的滚动条“裁剪”(通过更改其大小),但这更多的是hack。

10-07 15:31