2012-11-02 37 views
0

我正在构建一个处理截图的小型Java应用程序。 我有一个自定义的类,它继承自JPanel,名为ScreenshotPanel,它保存图像,它位于JScrollPane中。 ScrollPane在框架大小调整时移动并调整大小。 除缩放部分之外的所有其他效果都很好,我希望能够控制ScrollPane中的screenshotPanel的大小,但是screenshotPanel不会调整大小,它会以合适的大小闪烁片刻,但随后它会被调整回到ScrollPane大小。正确调整JScrollPane及其内容的大小

如果我使用不带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强制其大小?

+0

闪烁从JViewport的或JScrollBars或边界或其他???引起的,一切都只会有拍摄,没有SSCCE的黑暗 – mKorbel

+0

问题是你试图在JLabel中使用ImageIcon,或者你使用BuferrefedImage或scaledInstance(简单地是异步) – mKorbel

+0

你是对的我应该提到,我使用了一个BufferedImage作为screenshotPanel的图像。 – Bob

回答

1

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

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

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

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

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

记住,窗格不会调整它自己的形象,你有责任采取此;)

相关问题