Java 扩展JFrame而不是在程序中创建它
当使用Swing创建应用程序时,我看到人们做了以下两件事之一来创建JFrame。哪种方法更好?为什么 我是Java和编程的初学者。我唯一的学习来源是书籍、YouTube和StackOverflowJava 扩展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() {
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补充。即使在显示的少数代码行中,每一行都做了非常可疑的事情。例如
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)代码>
- 第三行再次设置帧的大小
有些人不像我们中的一些人那样经常(或曾经)提供自包含的示例(也不一定把这些示例看作是面向对象设计,而不仅仅是技术),但无论他们提供什么代码或建议,都应该得到高度重视
就个人而言,第一种方法(创建
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);
}
}