扩展JFrame与在程序中创建它

在使用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); } } 

思考:

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

更喜欢inheritance的组合 。

第二个例子使用inheritance,但没有充分的理由,因为它不会改变JFrame的function。


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

  1. 在Event Dispatch Thread上都没有创建GUI。
  2. getContentPane().setBackground(Color.WHITE); getContentPane().setLayout(null); setSize(800, 600);
    • 自Java 1.5以来,第一行的第一部分( getContentPane() )没有必要
    • 第二行使用null布局,这将打破我可以计算或描述的更多方式。
    • 第三行最好用pack();替换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位答案提供者的post。 无论你从这些人那里收集什么建议/代码,如果这些代码中的任何错误都会产生很少的错误。

    有些人不经常(或曾经)提供像我们这些人常做的那样的自包含的例子(并且不要仅仅考虑OO设计而不仅仅是技术),但无论他们提供什么代码,或者他们给出的建议,应该高度重视。

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

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

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

我对扩展JFrame的主要抱怨是,你实际上并没有添加任何新的特性或function,除了使用setVisible之外,它可以有效地重复使用

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

所以……价值2美分。 创建JFrame的实例并将其内容添加到其中。 如果需要,创建一个static方法调用showMyAwesomeGUI ,它为你做…

第一种方法更好。

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

转到第一种方法。

因为这样你可以创建更多的帧。 因为应用程序可以有多个窗口。 与第二种情况一样,您无法创建更多帧。

不要紧。

有理由说你可能会做其中一个,但没有任何这些原因它没有任何区别。

现在,如果你正在编写可能在命令行中运行的东西,或者可能是一个GUI程序,显然你可能想要一个不是GUI类的“主”类。

如果您在编程工作室工作,其中一个或另一个是标准,请务必遵循标准。 这个没有正确的答案,实际上很少在它们之间做出选择。