【问题标题】:swing: about resizing JFrames and conditional scrollingswing:关于调整 JFrame 大小和条件滚动
【发布时间】: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 中实施。然后我们会看看是否/如何/什么不起作用:-)

标签: java swing scroll jframe


【解决方案1】:

编辑

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。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 2012-05-20
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多