3

我有两个ScrolledComposites,我正在同步它们的垂直滚动位置,如下所示:

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。我只希望 oneScrolledComposite的滚动条可见,所以我将它们的可见性之一设置为 false:

vScroll2.setVisible(false);

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

4

2 回答 2

5

简单回答是不”。

如果您创建ScrolledComposite不带SWT.H_SCROLLor SWT.V_SCROLL,则它不能滚动,即调用setOrigin(Point)或相关方法根本不会做任何事情。

另一方面,如果您启用了滚动条,但又想隐藏它们,那么操作系统只会覆盖您的决定。滚动条由操作系统控制,这意味着操作系统将决定它们是否可见。调用setVisible(false)aScrollBar只不过是对操作系统的提示。它可能会跟随它,也可能不会......

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


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

于 2014-01-24T14:54:59.100 回答
2

这篇文章很旧(2014 年),但我不得不在这里权衡一下,因为接受的答案是完全错误的。除了以下内容之外,可能还有其他方法可以实现这一目标。像上面这样的答案比根本不回复更糟糕,因为它们具有误导性。

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

于 2019-05-18T05:33:50.100 回答