【问题标题】:What happens when a JFrame is resized?调整 JFrame 的大小时会发生什么?
【发布时间】:2013-06-22 09:10:21
【问题描述】:

我很好奇在调整 JFrame 大小时在 Java 中究竟发生了什么。

我之所以问这个问题,是因为我在将组件添加到 JFrame 内的 bigCONtainer(JPanel 类型)时遇到了问题。我想在用户执行某个操作时添加一些东西,但是在 JFrame 以某种方式调整大小之前,组件不会被明显添加。

我在尝试让新组件出现时发现了这一点;我调用了 myJFrame.pack()。作为第二个问题,我想知道 pack() 通常和特定于调整大小的作用。 Java 文档听起来好像会将每个组件的大小调整为其首选大小。如果我决定在我的实现中使用 pack() 来显示新组件,我的解决方案是始终设置首选大小。任何人都可以证明这是一种公认​​的编程实践吗?这确实是个好主意。

我还尝试了 repaint() 以显示新组件,但没有奏效。

【问题讨论】:

  • 为什么代码在 GUI 可见后添加新组件?
  • 如需尽快获得更好的帮助,请发帖SSCCE
  • @AndrewThompson 我正在编写的程序是为了体验。但是,我在用户加载文件后添加了一个标签,以提醒用户程序中发生了什么。
  • "..在用户加载文件后添加标签" 在启动时将标签添加到 GUI 中,无需文本。当有消息给用户时,设置一个文本(可能使用一次性 Swing Timer 来清除该字段)。另请查看工具提示。
  • @AndrewThompson 我有工具提示。我不希望在启动时添加标签。这违反了帖子的前提,但感谢您的想法。

标签: java swing resize jframe repaint


【解决方案1】:

您需要在运行时添加或删除组件的容器上调用revalidate()然后 repaint()

revalidate() 告诉容器的布局管理器重新布局它包含的组件,这就是您的代码中缺少的内容。如果没有这个请求,布局就不会改变,并且在您重新调整 GUI 大小之前您看不到这些变化,这几乎是做同样的事情。

请注意,如果您在启动时向 GUI 添加组件,则解决方案是仅在 之后将 pack()setVisible(true) 调用到顶级容器 已添加所有组件。

关于pack() 做什么的细节,做我们都做的——阅读源代码。

【讨论】:

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