swing:关于调整 JFrame 大小和条件滚动

Posted

技术标签:

【中文标题】swing:关于调整 JFrame 大小和条件滚动【英文标题】:swing: about resizing JFrames and conditional scrolling 【发布时间】:2012-04-12 21:29:14 【问题描述】:

我有一个JFrame,里面有一个JPanel。该面板显示在运行时从网络接收的图像。这些图像通常很大,但可以有任意大小。考虑到这一点,并考虑到我将来可能会在框架中添加一个菜单栏,我想做以下事情:

对于每个接收到的图像,面板都会调整到其确切大小。 如果图像(以及调整后的面板)的宽度或高度超过某个最大值(例如:屏幕大小 - 100 像素),则框架应调整为允许的最大值并启用滚动条。 否则,框架应调整其大小以显示整个面板而没有任何填充。所以框架大小是内容面板大小加上边框和标题栏(如果我最终添加它,还有菜单栏)。

有没有办法做到这一点?如果没有,最好的选择是什么?

提前致谢

编辑:

总而言之,问题是如何调整父框架的大小以适应其子内容面板。这与大多数人的做法相反(调整面板大小以适合框架)。

对于第 3 点,我已经有了内容面板尺寸,因此问题被简化为计算框架框架的大小(顶部标题栏高度、边框宽度)。有了它,我可以将框架的大小调整为内容窗格完全适合其中的大小。

【问题讨论】:

听起来很标准,pack() 有什么问题? @kleopatra 不知道原因,但不起作用。启动最小尺寸的框架,然后在收到图像时,我调整面板的大小。那时,如果我调用 pack,框架不会改变它的大小。 调整大小不是你的工作,而是 LayoutManager 的工作:让面板根据图像大小决定其 prefSize,让它在接收到新图像时重新验证自己,然后在框架上调用 pack-worksformalways(从我的头顶开始,手边没有 IDE) @kleopatra 里面只有一个带有自定义窗格的框架(我已经覆盖了paintComponent)。调用 pack 不起作用。我尝试在其自身和 contentPane 上调用也验证,但没有成功。我也尝试评论frame.setMinimumSize 行,但不走运。每次更新后,自定义窗格都称为 setSize 您描述的方式是错误的做法 - 阅读我的最后一条评论并在 sscce 中实施。然后我们会看看是否/如何/什么不起作用:-) 【参考方案1】:

将图像作为图标放入 JLabel,而不是将图像绘制到 JPanel

您可以使用 Image#getScaledInstance(int width, int height, int hints)

在 GUI 中显示之前缩小图像像素大小

请注意,您必须在 finally 块中正确关闭 InputStream,否则这些 Objects 会留在内存中,直到 OutOfMemoryError 锁定当前 JVM 实例

编辑

put images as Icon to the JLabel

但是

pictures = new ImageIcon("Xxxxx");
pictures.getImage().flush();
myLabel.setIcon(pictures);

这段代码最好从SwingWorkerRunnable#Thread调用,但在这种情况下你必须将代码行myLabel.setIcon(pictures);包装成invokeLater()

更多关于 SwingWorkerinvokeLater() 的教程在 Swing 中的并发性,这个论坛上关于并发性的一堆答案

【讨论】:

感谢您的建议,但我不想调整图像大小。这些应该以全尺寸显示。我需要的是根据图像大小和总显示大小启用或不启用滚动。 有趣的是,Swing 的设计并没有那么容易实现这一点,而是很多人选择使用图像图标 hack。

以上是关于swing:关于调整 JFrame 大小和条件滚动的主要内容,如果未能解决你的问题,请参考以下文章

JFrame 菜单被绘制,图形在 JFrame 调整大小时消失

JPanel 在调整 Jframe 大小之前不会更新

如何让JLabel在JFrame中动态调整大小?

调整JFrame大小后更新JFreeChart / JPanel

调整框架大小时保持圆心

将图像添加到 JFrame