我有两个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
,但是在运行上面的代码时会导致空指针异常。滚动条确实需要在那里,我只是希望它不可见。这可能吗?
答案 0 :(得分:4)
简单的答案是:“不”。
如果您创建的ScrolledComposite
没有SWT.H_SCROLL
或SWT.V_SCROLL
,则无法滚动,即调用setOrigin(Point)
或相关方法根本无法执行任何操作。
另一方面,如果启用滚动条,但想要隐藏它们,操作系统将覆盖您的决定。滚动条由OS控制,这意味着操作系统将决定它们是否可见。在setVisible(false)
上调用ScrollBar
只不过是对操作系统的暗示。它可能跟随或不跟......
很抱歉成为坏消息的承担者:\
你可以尝试将ScrolledComposite
包裹在另一个Composite
中,并强制将其“裁剪”所包含ScrolledComposite
的滚动条(通过更改其大小) ),但这更像是一个黑客。
答案 1 :(得分:2)
这篇文章很旧(2014年),但我不得不在这里权衡一下,因为公认的答案是完全错误的。除了以下内容,可能还有其他方法可以实现此目的。上面的答案比根本不回答要糟糕,因为它们会误导人。
如果在操作系统添加滚动条之后在处理的监听器中调用[YourScrolledComposite].getHorizontalBar().setVisible(false)
,它将被(重新)隐藏。这发生在绘制之前(或在绘制事件中),因此实际上永远不会显示滚动条。这使您可以将ScrolledComposite
与SWT.H_SCROLL
(或垂直)标志一起使用,并且仍然可以使用[YourScrolledComposite].setOrigin(...)
浏览内容。