当孩子调整大小时调整 JFrame 大小:如何跟上?

发布于 2024-11-08 04:50:16 字数 638 浏览 0 评论 0原文

我正在尝试使用包含 BoxLayout 的 JFrame (实际上是 Scala 的 Swing 包装器中的 Frame,尽管我不明白为什么这很重要) 它有多个项目,其中一个项目会根据按钮单击而更改大小(BoxLayout 中的另一个项目)。

调整大小时,按钮事件处理程序执行以下操作:

  1. 在更改大小的项目 (JPanel) 上调用方法;这会调用该组件的setPreferredSize
  2. JFrame 上调用 pack
  3. JFrame 上调用 repaint

这有一个非常奇怪的警告:JFrame 始终是落后一步。因此,如果我将首选 x 尺寸设置为 100、200、300、200、100,则 JFrame 的宽度将为 100、100、200、300、200。

可能会出现什么问题,以及如何传播尺寸更改当他们应该的时候 JFrame 窗口大小?

(更有可能但希望不是相关细节:Ubuntu 10.10 with Sun Java 1.6.0_24。)

I'm trying to work with a JFrame (actually, Frame in Scala's Swing wrapper, though I don't see why this should matter) that contains a BoxLayout which has several items, one of which changes size in response to a button click (another item in the BoxLayout).

When resizing, the button event handler does the following:

  1. Call a method on the item (JPanel) that changes size; this calls setPreferredSize for that component.
  2. Call pack on the JFrame
  3. Call repaint on the JFrame

This works with one very strange caveat: the JFrame is always one step behind. So if I set my preferred x sizes to 100, 200, 300, 200, 100 the JFrame will have width 100, 100, 200, 300, 200.

What might be going wrong, and how do I get the size changes to propagate out to the JFrame window size when they're supposed to?

(More possibly but hopefully not relevant details: Ubuntu 10.10 with Sun Java 1.6.0_24.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情丝乱 2024-11-15 04:50:16

当您更改组件的大小时,我会尝试 revalidate() 父容器,以便可以再次调用布局管理器,这将正确地重新计算所有大小。

如果您需要更多帮助,请发布您的 SSCCE 来说明问题。首先使用 JFrame 进行尝试,这样如果仍然存在问题,您就会知道问题是由标准 JDK 类还是 Scala 引起的。

When you change the size of a component I would try to revalidate() the parent container so the layout manager can be invoked again which will recalculate all the sizes properly.

If you need more help then post your SSCCE that demonstrates the problem. And first try this with a JFrame so if there is still a problem you will know if the standard JDK classes or Scala is causing the problem.

灼痛 2024-11-15 04:50:16

我同意 camickr 的观点,必须使用 revalidate() 而不是 pack()。要解决“落后一步”的问题,请尝试在 SwingUtilities.invokeLater() 中调用 revalidate()repaint()

I agree with camickr that revalidate() must be used instead of pack(). To fix the "one step behind" try to call revalidate() and repaint() in SwingUtilities.invokeLater().

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文