【问题标题】:Why does only the last JPanel I add to a JFrame resize?为什么只有我添加到 JFrame 的最后一个 JPanel 会调整大小?
【发布时间】:2011-12-17 06:31:21
【问题描述】:

所以我正在使用 swing 框架开发一个 GUI 应用程序。简而言之,我有 3 个 JPanel 作为我的应用程序的不同视图。现在的问题是,无论我将 JPanel 添加到 JFrame 的顺序如何,当我切换到该视图时,只有 final JPanel 会调整大小。

一些相关的代码:

在创建窗口时,我首先创建每个单独的 JPanel,并将其添加到 JFrame:

 JPanel newPanel = new SomeClassExtendingJPanel();
 this.jframe.add(newPanel);

接下来,每当我在应用程序的视图之间切换时,我都会隐藏当前处于活动状态的面板:

 jframe.validate();
 jframe.repaint();
 oldPanel.setVisible(false);

然后激活要显示的面板:

 jframe.validate();
 jframe.repaint();
 newPanel.setVisible(true);

有谁知道哪里出了问题?

【问题讨论】:

    标签: java swing


    【解决方案1】:

    要在每次交换时调整 JFrame 的大小,您可以在其上调用 pack(),但这是一直在调整 GUI 大小的做法。一个更好的解决方案是使用 Swing 用于交换视图的机制——CardLayout。这会将容器的大小调整为充分显示所有“卡片”组件所需的最大尺寸。

    查看CardLayout tutorialCardLayout API 了解更多信息。

    【讨论】:

    • 布局管理器应该在哪里?例如,如果我创建一个新的 JPanel 作为所有其他 JPanel 的容器,那么当 JFrame 调整大小时,该 JPanel 会实际调整大小吗?
    • 查看Nested Layout Example 了解如何组合布局的想法。
    【解决方案2】:

    JFrame 的 ContentPane 默认实现了BorderLayoutJComponents 可以只放一个Area

    您必须更改使用过的 LayoutManager 或将另一个 JPanel 放到另一个 Areas

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      • 2016-11-12
      • 1970-01-01
      • 2011-01-30
      • 2012-05-16
      • 2012-09-01
      相关资源
      最近更新 更多