Установите для ScrolledComposite ScrollBar видимость в false в SWT

У меня два 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 флаг, но это приводит к исключению нулевого указателя при выполнении вышеуказанного кода. Полоса прокрутки должна быть там, я просто хочу, чтобы она была невидимой. Это возможно?

1 ответ

Решение

Простой ответ: "Нет".

Если вы создаете ScrolledComposite без SWT.H_SCROLL или же SWT.V_SCROLL, его нельзя прокрутить, т.е. setOrigin(Point) или связанные методы просто ничего не сделают.

Если, с другой стороны, вы включаете полосы прокрутки, но хотите их скрыть, ОС просто отменит ваше решение. Полосы прокрутки управляются ОС, это означает, что ОС будет решать, видны они или нет. призвание setVisible(false) на ScrollBar это не более чем намек на ОС. Это может следовать или нет...

Извините, что я несу плохие новости:\


Вы можете попробовать обернуть ScrolledComposite в другой Composite и заставляя этот "обрезать" полосу прокрутки в содержании ScrolledComposite (путем изменения его размера), но это больше взломать.

Этот пост старый (2014), но мне пришлось взвесить здесь, потому что принятый ответ совершенно неверен. В дополнение к следующему, возможно, есть и другие способы достижения этого. Ответы, подобные приведенному выше, хуже, чем вообще не отвечать, потому что они вводят в заблуждение.

Если вы позвоните [YourScrolledComposite].getHorizontalBar().setVisible(false) внутри слушателя, который обрабатывается после того, как ОС добавляет полосу прокрутки, она будет (ре) скрыта. Это происходит перед рисованием (или в событии рисования), поэтому полоса прокрутки фактически никогда не отображается. Это позволяет вам сохранить ScrolledComposite с SWT.H_SCROLL (или вертикальные) флаги, и вы все еще можете перемещаться по содержимому, используя [YourScrolledComposite].setOrigin(...),

Другие вопросы по тегам