将 scroll-lock 按钮添加到 JScrollBar
Add scroll-lock button to JScrollBar
背景
希望在 JScrollPane
的角上添加一个 scroll-lock 按钮而不遮挡视口内容。下图显示了 JavaFX 应用程序中 SwingNode
包裹的 JScrollPane
:
lower-right 角显示一个带有锁定图标的按钮,可以切换,这是期望的结果:
请注意视口底部的内容——锁定按钮旁边的部分——是如何显示的。 (单击该按钮将模拟按下键盘上的 scroll-lock 按钮。顶部有一个 scroll-lock 按钮非常好,如果这样更容易的话。)
问题
JScrollPaneAPI显示如下图:
启用角组件似乎也需要添加一列header。 header 的添加遮挡了部分视口,与 scroll-lock 按钮高度成正比。这是显示可见列 header 的屏幕截图,它隐藏了文档的一部分:
想法
我试过使 header 视图面板透明,但无济于事。
代码
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's answer。
问题
如何将按钮添加到 JScrollPane
的底角(或顶角),以便不遮挡视口内容?
相关
- How to make a corner component always visible in a 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);
背景
希望在 JScrollPane
的角上添加一个 scroll-lock 按钮而不遮挡视口内容。下图显示了 JavaFX 应用程序中 SwingNode
包裹的 JScrollPane
:
lower-right 角显示一个带有锁定图标的按钮,可以切换,这是期望的结果:
请注意视口底部的内容——锁定按钮旁边的部分——是如何显示的。 (单击该按钮将模拟按下键盘上的 scroll-lock 按钮。顶部有一个 scroll-lock 按钮非常好,如果这样更容易的话。)
问题
JScrollPaneAPI显示如下图:
启用角组件似乎也需要添加一列header。 header 的添加遮挡了部分视口,与 scroll-lock 按钮高度成正比。这是显示可见列 header 的屏幕截图,它隐藏了文档的一部分:
想法
我试过使 header 视图面板透明,但无济于事。
代码
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's answer。
问题
如何将按钮添加到 JScrollPane
的底角(或顶角),以便不遮挡视口内容?
相关
- How to make a corner component always visible in a 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);