当孩子调整大小时调整 JFrame 大小:如何跟上?
我正在尝试使用包含 BoxLayout 的
它有多个项目,其中一个项目会根据按钮单击而更改大小(JFrame
(实际上是 Scala 的 Swing 包装器中的 Frame
,尽管我不明白为什么这很重要)BoxLayout
中的另一个项目)。
调整大小时,按钮事件处理程序执行以下操作:
- 在更改大小的项目 (
JPanel
) 上调用方法;这会调用该组件的setPreferredSize
。 - 在
JFrame
上调用pack
- 在
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:
- Call a method on the item (
JPanel
) that changes size; this callssetPreferredSize
for that component. - Call
pack
on theJFrame
- Call
repaint
on theJFrame
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
当您更改组件的大小时,我会尝试 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.
我同意 camickr 的观点,必须使用
revalidate()
而不是pack()
。要解决“落后一步”的问题,请尝试在SwingUtilities.invokeLater()
中调用revalidate()
和repaint()
。I agree with camickr that
revalidate()
must be used instead ofpack()
. To fix the "one step behind" try to callrevalidate()
andrepaint()
inSwingUtilities.invokeLater()
.