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

Фон

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

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

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

Проблема

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

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

Идеи

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

Код

Соответствующий код в 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 угол такой, что содержимое порта просмотра не закрывается?

Связанный

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);
Другие вопросы по тегам