【问题标题】:Resizing JFrame when child resizes: how to keep up?当孩子调整大小时调整 JFrame:如何跟上?
【发布时间】:2011-05-19 03:40:19
【问题描述】:

我正在尝试使用包含 BoxLayoutJFrame(实际上是 Scala 的 Swing 包装器中的 Frame,尽管我不明白这很重要),其中包含多个项目,其中之一更改大小以响应按钮单击(BoxLayout 中的另一项)。

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

  1. 调用改变大小的项目(JPanel)的方法;这会为该组件调用 setPreferredSize
  2. 拨打packJFrame
  3. 拨打repaintJFrame

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

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

(更多可能但不相关的细节:Ubuntu 10.10 with Sun Java 1.6.0_24。)

【问题讨论】:

    标签: java swing scala resize


    【解决方案1】:

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

    如果您需要更多帮助,请发布您的 SSCCE 来说明问题。首先尝试使用 JFrame,如果仍然存在问题,您将知道是标准 JDK 类还是 Scala 导致了问题。

    【讨论】:

    • 这样做了——在BoxLayout 上重新验证,而不是在JFrame 上验证/无效的任何组合。谢谢!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      相关资源
      最近更新 更多