扩展JFrame与在程序中创建它

sat*_*nam 27 java oop inheritance swing composition

在使用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);
        ................
    }
Run Code Online (Sandbox Code Playgroud)

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);

    }
}
Run Code Online (Sandbox Code Playgroud)

Hov*_*els 29

思考:

  • 避免扩展JFrame,因为它将您的GUI与JFrame绑定在一起.相反,如果您专注于创建JPanels,那么您可以自由地在任何需要的地方使用这些JPanel - 在JFrame,JDialog或JApplet中,或在另一个JPanel内部,或通过CardLayout与其他JPanel交换.
  • 通常避免继承,尤其是复杂类.这将防止有害的错误,如意外的方法覆盖(尝试创建一个JFrame或JPanel中,有一个getX()getY()方法,以明白我的意思!).
  • 如果使用IDE,则避免继承复杂类:如果覆盖复杂类,则在对这些类的对象调用方法时,将为您提供许多,太多的方法选择.
  • 封装是好的,并且允许创建更安全的代码.仅暴露需要暴露的物质,并尽可能地控制暴露.

  • *"如无意的方法覆盖"*我喜欢为这些案例投入实验性的"@Overrides".看到编译器错误,一切OK.删除符号并继续(直到我更改方法名称,签名等,然后..转到步骤1,冲洗并重复). (2认同)

And*_*son 18

更喜欢继承的组合.

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


顺便说一句,如果这些是你看到的代码示例,请找一个新的源代码1补充.即使在显示的少数代码行中,每个代码行都是非常值得怀疑的.例如

  1. 在Event Dispatch Thread上都没有创建GUI.
  2. getContentPane().setBackground(Color.WHITE); getContentPane().setLayout(null); setSize(800, 600);
    • getContentPane()自Java 1.5以来,第一行()的第一部分没有必要
    • 第二行使用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");
    • 第二行更好地设置为 guiFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    • 第3行再次设置框架的大小.

补充

  1. 提到你确实搜索了SO,这里有一个提示.查看Swing热门用户中前15位答案提供者的帖子.无论你从这些人那里收集什么建议/代码,如果这些代码中的任何错误都会产生很少的错误.

    一些不经常(或曾经)提供自包含像我们几个例子通常做(和不看那些例子一定是面向对象的设计而不仅仅是技术),但无论他们的代码提供,或建议他们给,应该高度重视.


Mad*_*mer 10

就个人而言,第一种方法(创建一个实例JFrame)是首选,我更喜欢这个因为......

它不会将您的应用程序锁定到专用容器中...您会看到很多人想要将applet添加到框架和框架到applet,如果他们已经将大部分GUI放在一个GUI中JPanel,他们就不会有这些问题.

这也意味着您创建的UI更加灵活.例如,您可以在当前应用程序或将来的应用程序中重复使用它,而不是锁定自己.

我延伸的主要抱怨JFrame是,你实际上并没有添加任何新功能或功能,除了使用之外,它可以有效地重复使用setVisible

我延伸的另一个问题JFrame是人们然后迅速覆盖paint,这真的非常糟糕.这样做有很多问题,不得不反复列出它们真的很痛苦......

所以...价值2美分以上.创建一个实例JFrame并将其添加到其中.如果需要,创建一个static方法调用showMyAwesomeGUI,为您完成...


Rei*_*eus 8

第一种方法更好.

通常,您不会向框架添加任何新功能,因此创建类的直接实例是有意义的.