如何在 JScrollPane 中居中垂直和水平滚动条?
Posted
技术标签:
【中文标题】如何在 JScrollPane 中居中垂直和水平滚动条?【英文标题】:How do I center the vertical and horizontal scrollbars in a JScrollPane? 【发布时间】:2013-12-20 07:46:21 【问题描述】:我有一个 JPanel,里面有一个 JLabel,添加到一个 JScrollPane。我有一个调用JLabel.setIcon("file.jpg");
的actionListener。图像正确显示在 JScrollPane 中并且是全尺寸的。滚动条看起来很完美。我试图默认将垂直和水平滚动条定位在中心,因此默认情况下您正在查看图像的中心。
是否有一个 JScrollPane 方法可以将视口定位在图像的中心?或者我可以手动将每个滚动条的位置设置为最大大小除以 2?
我试过了
JScrollPane.getVerticalScrollBar().setValue(JScrollPane.getVerticalScrollBar().getMaximum() / 2);
在编译时它不会使滚动条居中。我也尝试将我的 JPanel 的布局管理器设置为 GridBagLayout,但这也不起作用。
【问题讨论】:
【参考方案1】:基本上,您需要知道视口的可视区域的大小。
Rectangle bounds = scrollPane.getViewport().getViewRect();
然后您需要组件的大小,但是一旦将其添加到滚动窗格中,您就可以从视口中获取...
Dimension size = scrollPane.getViewport().getViewSize();
现在你需要计算中心位置...
int x = (size.width - bounds.width) / 2;
int y = (size.height - bounds.height) / 2;
那你只需要简单的调整一下视口位置...
scrollPane.getViewport().setViewPosition(new Point(x, y));
现在,请记住,只有在屏幕上实现滚动窗格(或至少在其父容器中布置)后,这才会起作用
【讨论】:
然后添加AdjustmentListener
并在那里进行这些超黑魔法计算 xD【参考方案2】:
我猜在您尝试执行代码时尚未读取图像,因此请尝试以下操作:
label.setIcon( new ImageIcon("...") );
SwingUtilities.invokeLater(new Runnable()
public void run()
Rectangle bounds = scrollPane.getViewport().getViewRect();
JScrollBar horizontal = scrollPane.getHorizontalScrollBar();
horizontal.setValue( (horizontal.getMaximum() - bounds.width) / 2 );
JScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue( (vertical.getMaximum() - bounds.height) / 2 );
);
这会将代码添加到事件调度线程的末尾,因此希望它在图像被完全读入并且滚动条值全部更新后执行。
【讨论】:
【参考方案3】:添加AdjustmentListener
看看是否有帮助。如果组件的值发生变化,它将通知您。这样,当添加图像时,滚动条的属性将发生变化并通知您。然后,您可以尝试将插入符号位置设置为中间。
教程:http://examples.javacodegeeks.com/desktop-java/awt/event/adjustmentlistener-example/
【讨论】:
以上是关于如何在 JScrollPane 中居中垂直和水平滚动条?的主要内容,如果未能解决你的问题,请参考以下文章
我如何在 <section><div class='row'><div class='col-sm'> 内的引导程序 4(水平 + 垂直)中居中 html“ul”元