【问题标题】:Should I add components to a JFrame or to its contentPane?我应该将组件添加到 JFrame 还是它的 contentPane?
【发布时间】:2012-01-08 02:32:42
【问题描述】:

当我在第一门 Java 课程中学习创建 Java GUI:s 时,我被教导将我的窗口创建为 JFrame 实例,然后为每个 JFrame 添加一个 JPanel,最后将所有 GUI 组件添加到JPanel:

class Example extends JFrame {
    Example() {
        JPanel panel = new JPanel();
        this.add(panel);

        // Create components here and add them to panel
        // Perhaps also change the layoutmanager of panel

        this.pack();
        this.setVisibility(true);
    }

    public static void main(String[] args) {
        new Example();
    }
}

我总是认为“嗯,这有点味道;我不喜欢创建一个额外的对象只是为了成为一个容器”,但我不知道有任何其他方法可以做到这一点,所以我就继续做了。直到最近,当我偶然发现这个“模式”时:

class AnotherExample extends JFrame {
    AnotherExample() {
        Container pane = this.getContentPane();

        // Add components to and change layout of pane instead

        this.pack();
        this.setVisibility(true);
    }

    public static void main(String[] args) {
        new AnotherExample();
    }
}

对于 Java 还是很陌生,我对第二种方法感觉更好,因为它不涉及创建 JPanel 来包装其他组件。但是除了这些之外,这些方法之间的真正区别是什么?他们中的任何一个都比另一个有什么好处吗?

【问题讨论】:

  • 阅读本教程了解更多信息:docs.oracle.com/javase/tutorial/uiswing/components/…
  • 很棒的教程!我建议任何发现此问题的人阅读它。
  • 没关系(两者都不好,也不需要做,只需添加到框架中) - 真正的气味是 extends JFrame :good ol' OO 规则是仅当存在合理的 is-a 关系时才进行扩展(与仅使用情况相比,所有 gui 应用程序中 99.99% 的情况都是如此)

标签: java swing jframe


【解决方案1】:

我更喜欢创建一个JPanel(它是一个 Swing 容器,可以有一个边框)并将其设置作为内容窗格。

要从内容窗格中获取JComponent 需要强制转换,这比创建额外组件的气味还要糟糕。

【讨论】:

  • ...你为什么要这样做?是什么让这种方法比我发布的两种方法更好(或不同)?
  • 顺便说一句:好主意!这可能是我迄今为止最喜欢的方法(对实际事实一无所知)=)
  • 我猜第一条评论是在我编辑答案之前发表的。提交后,我重新阅读了问题,以查看我的答案..没有回答。 ;)
  • BTW - 作为nested layouts 的推广者(布局中的布局,每个都需要像JPanel 这样的容器),我对创建额外组件只是为了制作GUI 的想法相当不敏感工作无论如何都是“不洁的”。 :)
  • 我绝不反对创建更多组件以使事情正常运行 - 只是如果在 JFrame 上已经定义了一个容器 is 我发现很难找到放置另一个仍将覆盖 GUI 相同区域的理由。直到现在,当我发现其中有完美的理由时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
相关资源
最近更新 更多