Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 扩展JFrame而不是在程序中创建它_Java_Swing_Oop_Inheritance_Composition - Fatal编程技术网

Java 扩展JFrame而不是在程序中创建它

Java 扩展JFrame而不是在程序中创建它,java,swing,oop,inheritance,composition,Java,Swing,Oop,Inheritance,Composition,当使用Swing创建应用程序时,我看到人们做了以下两件事之一来创建JFrame。哪种方法更好?为什么 我是Java和编程的初学者。我唯一的学习来源是书籍、YouTube和StackOverflow import {imports}; public class GuiApp1 { public static void main(String[] args) { new GuiApp1(); } public GuiApp1() {

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

我是Java和编程的初学者。我唯一的学习来源是书籍、YouTube和StackOverflow

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

没关系


你可能会这样做或那样做是有原因的,但如果没有任何一个原因,那就没有任何区别

现在,如果您正在编写一些可以从命令行操作的东西,或者可能是一个GUI程序,那么显然您可能需要一个不是GUI类的“main”类


如果您在一个编程商店工作,其中一个是标准的,那么一定要遵循标准。这个问题没有正确的答案,事实上,在两者之间几乎没有选择余地。

第一种方法更好

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

思考:

  • 避免扩展JFrame,因为它将GUI与JFrame绑定在一起。相反,如果您专注于创建JPanel,那么您就可以自由地在任何需要的地方使用这些JPanel——在JFrame、JDialog、JApplet中,或者在另一个JPanel内部,或者通过CardLayout与其他JPanel交换
  • 一般避免继承,特别是复杂类的继承。这将防止有害的错误,例如意外的方法重写(尝试创建一个JFrame或JPanel,其中包含
    getX()
    getY()
    方法,以了解我的意思!)
  • 如果您使用IDE,请避免继承复杂类:如果您重写复杂类,当您调用这些类的对象上的方法时,您将有很多、太多的方法可供选择
  • 封装很好,并且允许创建更安全的代码。只暴露需要暴露的,并尽可能控制暴露
    • 我更喜欢

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


      另外,如果您看到的是这些代码示例,请查找新的source1补充。即使在显示的少数代码行中,每一行都做了非常可疑的事情。例如

    • 在事件分派线程上既不创建GUI也不创建GUI
    • getContentPane().setBackground(颜色.白色);
      getContentPane().setLayout(null);
      设置大小(800600)
      
      • 第一行的第一部分(
        getContentPane()
        )自Java 1.5以来就不再需要了
      • 第二行使用了
        null
        布局,这将以我可以计数或描述的更多方式中断
      • 第三行最好用
        pack()替换
    • JFrame guiFrame=newjframe();
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setTitle(“示例GUI”);
      guiFrame.setSize(300250)
      
      • 第一行和第三行可以收缩为:
        jframeguiframe=newjframe(“示例GUI”)
      • 第二行最好设置为
        guiFrame.setDefaultCloseOperation(JFrame.DISPOSE\u ON\u CLOSE)
      • 第三行再次设置帧的大小
    • 补充
    • 在提到你这样做的时候,这里有一个提示。请查看网站上排名前15位的答案提供者的帖子。无论您从这些人那里收集到什么建议/代码,您都不会犯这些代码示例中的任何错误

      有些人不像我们中的一些人那样经常(或曾经)提供自包含的示例(也不一定把这些示例看作是面向对象设计,而不仅仅是技术),但无论他们提供什么代码或建议,都应该得到高度重视

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

      它不会将您的应用程序锁定在专用容器中……您会看到许多人希望将小程序添加到框架中,并将框架添加到小程序中,如果他们首先将大部分GUI放在
      JPanel
      中,他们就不会有这些问题

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

      我对扩展
      JFrame
      的主要不满是,您实际上没有向它添加任何新的特性或功能,除了使用
      setVisible

      扩展
      JFrame
      的另一个问题是,人们会立即覆盖
      paint
      ,这非常非常糟糕。这样做有太多的问题,重复列出这些问题是很痛苦的


      所以…要多花2美分。创建
      JFrame
      的实例,并将您的内容添加到其中。如果需要,创建一个
      static
      method调用
      showMyAwesomeGUI
      ,它可以为您实现这一点…

      使用第一种方法


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

      “您可能会选择其中一种或另一种”……您能举一个这样的原因的简短示例吗?我做了。请再读一遍,“这不重要”-但确实如此,方法的选择将产生需要访问和决定的影响…当然,选择会产生影响,但没有一个会使一个比另一个更可取。如果道路上有一个岔口,两条路都在同一个地方,你走哪条路可能无关紧要,但它们会不同。“你走哪条路可能无关紧要”,如果桥在1号路上,也可能如此。魔鬼在于细节。这只是我个人的观点,你的许多答案基本上都说了同样的话,或多或少,偶尔会有不同
      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);
      
          }
      }