Java 当子对象调整大小时调整JFrame的大小:如何跟上?

Java 当子对象调整大小时调整JFrame的大小:如何跟上?,java,swing,scala,resize,Java,Swing,Scala,Resize,我正在尝试使用一个JFrame(实际上,Scala的Swing包装器中的Frame,但我不明白这有什么关系),它包含一个BoxLayout,其中有几个项,其中一个项会随着按钮的点击而改变大小(另一项在BoxLayout中) 调整大小时,按钮事件处理程序执行以下操作: 对更改大小的项(JPanel)调用方法;这将调用该组件的setPreferredSize 在JFrame上调用pack 在JFrame 这是一个非常奇怪的警告:JFrame总是落后一步。因此,如果我将首选的x尺寸设置为100、200

我正在尝试使用一个
JFrame
(实际上,Scala的Swing包装器中的
Frame
,但我不明白这有什么关系),它包含一个
BoxLayout
,其中有几个项,其中一个项会随着按钮的点击而改变大小(另一项在
BoxLayout
中)

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

  • 对更改大小的项(
    JPanel
    )调用方法;这将调用该组件的
    setPreferredSize
  • JFrame上调用
    pack
  • JFrame
  • 这是一个非常奇怪的警告:JFrame总是落后一步。因此,如果我将首选的x尺寸设置为100、200、300、200、100,JFrame的宽度将为100、100、200、300、200

    可能出了什么问题,我如何让大小更改在应该传播到JFrame窗口大小时传播出去


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

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


    如果你需要更多的帮助,那就发表你的文章,说明问题所在。首先用JFrame试试,这样如果仍然存在问题,您就会知道是标准JDK类还是Scala导致了问题。

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

    中调用
    revalidate()
    repaint()
    ,在
    BoxLayout
    上重新验证,而不是在
    JFrame
    上进行任何验证/无效组合。谢谢