Добавить кнопку блокировки прокрутки в JScrollBar

Фон

Хотите добавить кнопку блокировки прокрутки в угол JScrollPane, не закрывая содержимое окна просмотра. На следующем изображении показано, как JScrollPane завернуто в SwingNode в приложении JavaFX:

Фактическое

В правом нижнем углу показана кнопка со значком замка, который можно переключить, что является желаемым результатом:

Окончательный

Обратите внимание, как видно содержимое в самом низу окна просмотра — часть рядом с кнопкой блокировки. (Нажатие кнопки будет имитировать нажатие кнопки блокировки прокрутки на клавиатуре. Наличие кнопки блокировки прокрутки вверху вполне нормально, если так проще.)

Проблема

JScrollPane API показывает следующее изображение:

JScrollPane

Включение углового компонента также требует добавления заголовка столбца. Добавление заголовка закрывает часть окна просмотра прямо пропорционально высоте кнопки блокировки прокрутки. Вот скриншот, показывающий видимый заголовок столбца, который скрывает часть документа:

Скрытый вывод

Идеи

Я пытался сделать панель просмотра заголовка прозрачной, но безрезультатно.

Код

Соответствующий код в SwingNode:

// FlyingSaucer subclass
mView = new HtmlPanel(); 
mScrollPane = new JScrollPane( mView );
setContent( mScrollPane );

final var lock = new JButton( "X" );
mScrollPane.setCorner( UPPER_TRAILING_CORNER, lock );
mScrollPane.setVerticalScrollBarPolicy( VERTICAL_SCROLLBAR_ALWAYS );

final var header = new JPanel();
header.setPreferredSize(
  new Dimension( 12, lock.getPreferredSize().height ) );
header.setOpaque( false );
header.setBackground( new Color( 0, 0, 0, 0 ) );
mScrollPane.setColumnHeaderView( header );

Другой пример см. в ответе camickr.

Вопрос

Как бы вы добавили кнопку в нижний (или верхний) угол JScrollPane, чтобы содержимое окна просмотра не закрывалось?

Связанный


person Dave Jarvis    schedule 23.02.2021    source источник
comment
Итак, если угловые компоненты исключены, имеет ли смысл предоставлять собственный компонент полосы прокрутки, который позволяет отображать блокировку прокрутки? Я предполагаю, что функциональность блокировки прокрутки в любом случае связана с прокруткой, поэтому вы можете создать «LockableScrollbar».   -  person Hiran Chaudhuri    schedule 23.02.2021
comment
Если вы хотите всегда отображать и горизонтальную полосу прокрутки, то у вас всегда будет место в правом нижнем углу для углового компонента.   -  person Abra    schedule 23.02.2021


Ответы (1)


Я бы предложил использовать панели-оболочки для достижения желаемого макета. Что-то вроде:

JButton scrollLock = new JButton("...");

JScrollPane scrollPane = new JScrollPane(...);
JScrollBar verticalBar = scrollPane.getVerticalScrollBar();

JPanel verticalPanel = new JPanel( new BorderLayout() );
verticalPanel.add(verticalBar, BorderLayout.CENTER);
verticalPanel.add(scrollLock, BorderLayout.PAGE_END);

JPanel wrapper = new JPanel( new BorderLayout() );
wrapper.add(scrollPane, BorderLayout.CENTER);
wrapper.add(verticalPanel, BorderLayout.LINE_END);

setContent(wrapper);
person camickr    schedule 23.02.2021
comment
Это немного громоздко без установки предпочтительных размеров, но определенно работает. - person Dave Jarvis; 23.02.2021
comment
Если вы добавляете JButton, вы можете использовать метод setMargin(...) для удаления лишнего пространства вокруг вашего текста/значка. Ширина кнопки будет контролировать ширину полосы прокрутки. - person camickr; 23.02.2021