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

Dav*_*son 3 java swing center jscrollpane jscrollbar

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

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

我试过了

JScrollPane.getVerticalScrollBar().setValue(JScrollPane.getVerticalScrollBar().getMaximum() / 2);
Run Code Online (Sandbox Code Playgroud)

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

Mad*_*mer 6

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

Rectangle bounds = scrollPane.getViewport().getViewRect();
Run Code Online (Sandbox Code Playgroud)

然后你需要组件的大小,但是一旦它被添加到滚动窗格,你可以从视图端口获取...

Dimension size = scrollPane.getViewport().getViewSize();
Run Code Online (Sandbox Code Playgroud)

现在你需要计算中心位置......

int x = (size.width - bounds.width) / 2;
int y = (size.height - bounds.height) / 2;
Run Code Online (Sandbox Code Playgroud)

然后你需要简单地调整视口位置......

scrollPane.getViewport().setViewPosition(new Point(x, y));
Run Code Online (Sandbox Code Playgroud)

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


cam*_*ckr 6

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

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 );
    }
});
Run Code Online (Sandbox Code Playgroud)

这会将代码添加到事件调度线程的末尾,因此希望它在图像完全读入并且滚动条值全部更新后执行。