如何将垂直和水平滚动条置于JScrollPane中心?

时间:2013-12-04 01:08:57

标签: java swing jscrollpane center jscrollbar

我有一个带有JLabel的JPanel,添加到JScrollPane。我有一个调用JLabel.setIcon("file.jpg");的actionListener。图像正确显示在JScrollPane中,并且是完整大小。滚动条显示完美。我正在尝试将垂直和水平滚动条默认定位在中心,因此默认情况下您正在查看图像的中心。

是否有一个JScrollPane方法将视口定位在图像的中心?或者我可以手动将每个滚动条的位置设置为最大尺寸除以2吗?

我试过了

JScrollPane.getVerticalScrollBar().setValue(JScrollPane.getVerticalScrollBar().getMaximum() / 2);

虽然它编译它不会使滚动条居中。我也尝试将我的JPanel的布局管理器设置为GridBagLayout,但这也不起作用。

3 个答案:

答案 0 :(得分:6)

基本上,您需要知道视口可视区域的大小。

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

现在,请记住,只有在屏幕上实现滚动窗格(或至少它已在其父容器中布局)之后,这才会起作用。

答案 1 :(得分:3)

我猜测您在尝试执行代码时尚未读取图像,请尝试以下操作:

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

这会将代码添加到Event Dispatch Thread的末尾,所以希望它在完全读入图像并且滚动条值全部更新后执行。

答案 2 :(得分:1)

添加AdjustmentListener,看看是否有帮助。如果组件的值发生变化,它会通知您。这样,添加图像后,滚动条的属性将发生变化,您将收到通知。然后,您可以尝试将插入位置设置为中间位置。

教程:http://examples.javacodegeeks.com/desktop-java/awt/event/adjustmentlistener-example/