如何在 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 中居中垂直和水平滚动条?的主要内容,如果未能解决你的问题,请参考以下文章

如何让span中的文字水平居中?

我如何在 <section><div class='row'><div class='col-sm'> 内的引导程序 4(水平 + 垂直)中居中 html“ul”元

如何在堆栈中垂直或水平居中小部件?

如何在引导程序 4 的容器中垂直和水平居中文本? [复制]

如何在方形div中垂直和水平居中单个字符

如何在tabhost中居中文本?