swing:关于调整 JFrame 大小和条件滚动
Posted
技术标签:
【中文标题】swing:关于调整 JFrame 大小和条件滚动【英文标题】:swing: about resizing JFrames and conditional scrolling 【发布时间】:2012-04-12 21:29:14 【问题描述】:我有一个JFrame
,里面有一个JPanel
。该面板显示在运行时从网络接收的图像。这些图像通常很大,但可以有任意大小。考虑到这一点,并考虑到我将来可能会在框架中添加一个菜单栏,我想做以下事情:
有没有办法做到这一点?如果没有,最好的选择是什么?
提前致谢
编辑:
总而言之,问题是如何调整父框架的大小以适应其子内容面板。这与大多数人的做法相反(调整面板大小以适合框架)。
对于第 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);
这段代码最好从SwingWorker
或Runnable#Thread
调用,但在这种情况下你必须将代码行myLabel.setIcon(pictures);
包装成invokeLater()
,
更多关于 SwingWorker
和 invokeLater()
的教程在 Swing 中的并发性,这个论坛上关于并发性的一堆答案
【讨论】:
感谢您的建议,但我不想调整图像大小。这些应该以全尺寸显示。我需要的是根据图像大小和总显示大小启用或不启用滚动。 有趣的是,Swing 的设计并没有那么容易实现这一点,而是很多人选择使用图像图标 hack。以上是关于swing:关于调整 JFrame 大小和条件滚动的主要内容,如果未能解决你的问题,请参考以下文章
java swing编程问题:一个jframe中添加一个jpanel后,为jpanel添加一个滚动条,当jpanel中内容过多时滑动