将滚动锁定按钮添加到 JScrollBar

问题描述

背景

希望在 JScrollPane 的角落添加一个滚动锁定按钮而不遮挡视口内容。下图显示了在 JavaFX 应用程序中包裹在 JScrollPane 中的 SwingNode

Actual

右下角显示一个带有锁定图标的按钮,可以切换,这是想要的结果:

Final

请注意视口最底部内容(锁定按钮旁边的部分)是如何可见的。 (点击该按钮将模拟按下键盘上的滚动锁定按钮。在顶部有一个滚动锁定按钮非常好,如果这样更容易的话。)

问题

JScrollPane API 显示如下图:

JScrollPane

启用角落组件似乎还需要添加标题标题添加掩盖了视口的一部分,与滚动锁定按钮的高度成正比。这是显示可见列标题的屏幕截图,其中隐藏了文档的一部分:

Obscured output

想法

我尝试将标题视图面板设为透明,但无济于事。

代码

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 ) );
mScrollPane.setColumnHeaderView( header );

一个例子见camickr's answer

问题

您将如何在 JScrollPane 的底角(或顶角)添加按钮以使视口内容不被遮挡?

相关

解决方法

我建议使用“包装器”面板来实现您想要的布局。类似的东西:

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);