扩展 JFrame 与在程序中创建 JFrame

2022-09-01 11:30:18

在使用 Swing 创建应用程序时,我看到人们做两件事之一来创建 JFrame。哪种方法更好,为什么?

我是Java和编程的初学者。我唯一的学习来源是书籍,YouTube和Stack Overflow。

import {imports};

public class GuiApp1 {

    public static void main(String[] args) {

        new GuiApp1();
    }

    public GuiApp1()  {
        JFrame guiFrame = new JFrame();

        guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        guiFrame.setTitle("Example GUI");
        guiFrame.setSize(300,250);
        ................
    }

import {imports};

public class GuiApp1 extends JFrame {

    public Execute() {
        getContentPane().setBackground(Color.WHITE);
        getContentPane().setLayout(null);
        setSize(800, 600);
        .............
    }

    public static void main(String[] args) {
        Execute frame1 = new Execute();
        frame1.setVisible(true);

    }
}

答案 1

思潮:

  • 避免扩展JFrame,因为它将你的GUI绑定到JFrame。相反,如果你专注于创建JPanels,那么你可以自由地在需要的任何地方使用这些JPanels - 在JFrame,JDialog,或JApplet,或在另一个JPanel内部,或通过CardLayout与其他JPanel交换。
  • 一般情况下避免继承,尤其是复杂类的继承。这将防止有害的错误,例如无意的方法覆盖(尝试创建一个具有和方法的JFrame或JPanel,以了解我的意思!getX()getY()
  • 如果您使用的是 IDE,请避免继承复杂类:如果重写复杂类,则在对这些类的对象调用方法时,将为您提供太多的方法选择。
  • 封装是好的,是并允许创建更安全的代码。仅公开需要公开的内容,并尽可能控制该曝光。

答案 2

继承相比,更喜欢组合

第二个示例使用继承,但没有充分的理由,因为它不会更改 的功能。JFrame


顺便说一句,如果这些是你看到的代码示例,请找到一个新的源1 补充。即使在显示的几行代码中,每个代码行都做了非常可疑的事情。例如

  1. 在事件调度线程上不会创建任何 GUI。
  2. getContentPane().setBackground(Color.WHITE); getContentPane().setLayout(null); setSize(800, 600);
    • 自 Java 1.5 以来,第 1 行 () 的第一部分就不需要了getContentPane()
    • 第二行使用布局,这将以我可以计数或描述的更多方式中断。null
    • 第三行最好改为pack();
  3. JFrame guiFrame = new JFrame(); guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); guiFrame.setTitle("Example GUI"); guiFrame.setSize(300,250);
    • 第一行和第三行可以承包给:
      JFrame guiFrame = new JFrame("Example GUI");
    • 第 2 行最好设置为guiFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    • 第 3 行再次设置帧的大小。

补充

  1. 提到你确实搜索SO,这里有一个提示。查看Swing顶级用户中前15个答案提供商的帖子。无论你从这些人那里收集到什么建议/代码,如果这些代码示例中的任何错误,都不会犯什么。

    有些人不经常(或永远不会)像我们中的一些人通常那样提供自包含的示例(并且不一定为OO设计而不是技术而寻找这些示例),但是无论他们提供什么代码,或者他们给出的建议,都应该得到高度考虑。