在SWT中将ScrolledComposite的ScrollBar可见性设置为false

时间:2014-01-24 13:38:28

标签: java swt scrolledcomposite

我有两个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,但是在运行上面的代码时会导致空指针异常。滚动条确实需要在那里,我只是希望它不可见。这可能吗?

2 个答案:

答案 0 :(得分:4)

简单的答案是:“不”。

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

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

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


可以尝试将ScrolledComposite包裹在另一个Composite中,并强制将其“裁剪”所包含ScrolledComposite的滚动条(通过更改其大小) ),但这更像是一个黑客。

答案 1 :(得分:2)

这篇文章很旧(2014年),但我不得不在这里权衡一下,因为公认的答案是完全错误的。除了以下内容,可能还有其他方法可以实现此目的。上面的答案比根本不回答要糟糕,因为它们会误导人。

如果在操作系统添加滚动条之后在处理的监听器中调用[YourScrolledComposite].getHorizontalBar().setVisible(false),它将被(重新)隐藏。这发生在绘制之前(或在绘制事件中),因此实际上永远不会显示滚动条。这使您可以将ScrolledCompositeSWT.H_SCROLL(或垂直)标志一起使用,并且仍然可以使用[YourScrolledComposite].setOrigin(...)浏览内容。