正确调整JScrollPane及其内容的大小

时间:2012-11-02 18:59:01

标签: java swing jpanel jscrollpane image-zoom

我正在构建一个处理截图的小型Java应用程序。 我有一个继承自JPanel的自定义类,名为ScreenshotPanel,用于保存图像,它位于JScrollPane中。调整帧大小时,ScrollPane会移动并调整大小。 一切正常,除了缩放部分,我希望能够控制ScrollPane内的screenshotPanel的大小,但是screenshotPanel没有调整大小,它在适当的大小闪烁一会然后它被调整大小回到ScrollPane大小

如果我在没有ScrollPane的情况下使用screenshotPanel它完全正确,但我希望它能自动添加滚动条,这样你就可以看到在放大时移动图像。

以下是我用来调整大小的代码部分:

    double AR=((double)screenshotPanel.getImage().getHeight())/screenshotPanel.getImage().getWidth();

    screenshotPanel.setSize((int)((getWidth()-180)*zoomFactor), (int)((AR*(getWidth()-180)-100)*zoomFactor));
    scrollPane.setSize(getWidth()-180, (int)(AR*(getWidth()-180))-100);

-180和-100用于为按钮和缩放控制组件保留一个空间(所有这些都可以完美地移动和调整大小),zoomFactor是一个可以容纳缩放量的双倍。

如何在没有ScrollPane强制缩小尺寸的情况下调整ScrollPane中的screenshotPanel的大小?

1 个答案:

答案 0 :(得分:1)

更改组件的大小不会缩放图像,除非您在paint方法中有代码来补偿大小的变化。

JViewPort尊重您的组件首选大小,因此当您更改大小并且视口重置它时,您会得到此闪烁。

在面板中添加scale方法并覆盖getPreferredSize方法。

当您致电setScale时,请计算新的缩放尺寸。确保getPreferredSize方法返回这些值。

您需要致电invalidate,可能还需要repaint,以确保通过容器层次结构更新更改。

请记住,窗格不会自行调整图片大小,您负责拍摄;)