【问题标题】:Add scroll-lock button to JScrollBar将滚动锁定按钮添加到 JScrollBar
【发布时间】:2021-02-23 06:22:05
【问题描述】:

背景

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

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

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

问题

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's answer

问题

如何在JScrollPane 的底角(或顶角)添加一个按钮,以免遮挡视口内容?

相关

【问题讨论】:

  • 那么如果排除了角组件,提供一个自定义滚动条组件来允许渲染滚动锁是否有意义?我猜滚动锁定功能无论如何都与滚动有关,因此您可以创建一个“LockableScrollbar”。
  • 如果您也愿意始终显示水平滚动条,那么您将始终在右下角留出空间用于角组件。

标签: java swing jscrollpane jscrollbar scroll-lock


【解决方案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);

【讨论】:

  • 如果您要添加 JButton,您可以使用 setMargin(...) 方法删除文本/图标周围的多余空间。按钮的宽度将控制滚动条的宽度。
猜你喜欢
  • 2014-07-28
  • 1970-01-01
  • 2013-05-24
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
相关资源
最近更新 更多