调整JPanel大小并重采样以保留内容

3

我已经写了一个带有许多不同组件的JPanel,是否有一种方法可以在面板上应用整体"扩张"能力,以便当我调整窗口大小时,它内部的所有内容都按比例拉伸?

也就是说,如果我手动将我的窗口调整为原来的1/4大小,面板中的每个组件也应该缩小1/4,以便新面板只是第一个面板的扩张版本。鉴于我没有设计单独的组件来实现这一点(有很多组件),是否有任何简单的方法使面板表现出这种行为?

更新:为了更清楚地描述我需要的解决方案,我将描述面板内容:

该面板是一种“游戏”,具有单个空布局和数十个ImageIcon在屏幕上飞行。 ImageIcons是预加载的PNG文件,其已经具有固定的大小。当然,我可以手动调整每个Image Icon并将其重新定位相对于窗口大小,但那将涉及重编码许多组件。

没有按钮或文本需要担心,所以我真正需要的是一种“后处理”调整大小方式,其中面板只需按比例缩小渲染的任何内容(就像在Photoshop中调整图像大小一样)。


+1,好问题。我曾经通过调整组件的大小并在每次调整大小事件中通过外观和感觉调整字体大小来手动完成这个过程。这是一个可怕的解决方案。 - aioobe
4个回答

2
一种选择当然是完全放弃Swing并使用某些第三方小部件组件库,该库使用任何 Graphics 来绘制自己。然后,您可以在图像上绘制小部件并调整图像的大小,或者更好的方法是将转换应用于传递给库的图形对象。
如果确实想坚持使用Swing,则可以使用 SwingUtilities.paintComponent 方法来将 Panel 绘制到 BufferedImage 上,然后可以调整大小。(我自己使用过这个方法,在游戏中实现了一些不错的“视图”过渡效果。)
问题当然是您需要相应地翻译用户输入。目前我没有解决方案,但以上内容或许能在某种程度上帮助您。

好的,事实证明面板本身没有直接的用户输入(还有另一个 UI 来实现)。也许在 BufferedImage 上绘制会有用!你可以给一些代码提示吗? - donnyton
如果我没记错的话,其实没有太多东西。1)创建所需尺寸的缓冲图像。2)执行getGraphics,如果需要,请将其转换为Graphics2D,3)调用graphics.scale,以便绘画将缩放以适合缓冲图像,4)将graphics对象(以及要绘制的面板)传递给我链接到的paintComponent方法,然后您应该在缓冲图像上绘制了面板,该图形对象在其上绘制。 - aioobe

1

使用布局管理器而不是小部件的绝对定位将为您提供此行为。请参阅Oracle教程:使用布局管理器

您真的希望在调整大小事件上调整字体吗?我不知道有哪个布局管理器会为您执行此操作。


1
可调大小的布局不符合我的需求:所涉及的面板是一种“游戏”-它包含许多图标在空布局中飞行,但由于这些图标是预加载的PNG文件,因此没有提供轻松的方法来调整窗口大小。是否有一种方法可以“后处理”某种大小调整操作来扩张面板及其内容? - donnyton
好的,我听不懂你的意思。当我阅读你的问题时,我脑海中想到的是标准GUI界面,带有按钮等。 - Kai

1
您可以尝试重写面板的paintChildren()方法并缩放图形以实现所需的可见大小。

1

演示很不错。但是在我的电脑上有很多错误。也许是我的JRE出了一些问题。:P - aioobe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接