java - 建立JFrame的语法。哪个是对的?

标签 java swing inheritance jframe composition

我是编程新手,对 Java 绝对是新手。在今年秋天开始计算机科学类(class)之前,我正在自学,我对从两位不同作者那里看到的语法很好奇。 在一本书中,通常通过将类作为JFrame的扩展来建立一个JFrame

public class MyClass extends JFrame {

等等

但是,另一位作者以及本网站上的问题通常会在类内部建立一个框架:

public class MyClass {
JFrame frame = new JFrame();

首先,一个比另一个有什么优势? 在我看来,虽然我不是专家,但将类作为 JFrame 的扩展可以更轻松地设置框架的参数以及向其中添加组件。

IE中的扩展格式,你随便说

add(component);

但是,在其他格式中,必须键入:

frame.getContentPane().add(component);

这看起来更乏味。

有人可以简明扼要地解释一下这背后的原因,或者这只是一个偏好问题。我对此进行了调查,但无法得到直接的答案。

最佳答案

许多人(包括我)更喜欢后者有哲学和实践上的原因:

  • 总体上更喜欢组合而不是继承。
  • 仅当您打算更改类的固有行为(即覆盖其一个或多个方法)时才扩展该类。
  • 通过不扩展 JFrame,可以更轻松地创建最大化内聚和最小化耦合的类,并编写干净的基于 MVC 的代码。此概念的一个更重要的示例是避免让您的 GUI 代码(您的 View 代码)实现任何监听器接口(interface)(您的控制 代码)。这对于婴儿程序来说没问题,但对于有可能变得复杂的成人代码来说就不行了。
  • 通过不扩展大型复杂类(例如 JFrame),您可以降低难以调试的隐藏覆盖恶意行为的风险。尝试扩展 JFrame 或 JPanel 并为类提供 getX()getY() 方法,看看我的意思!
  • 如果您使用的 IDE 可以为您的类的对象提供可用方法的建议,并且您不重写 JFrame 等庞大的复杂类,则可以大大减少可能建议方法的数量(和复杂性)。
  • 通过调整您的 Swing GUI 来创建 JPanel 而不是覆盖 JFrame,您可以大大提高该 GUI 使用方式的灵 active 。现在它可以作为更复杂的 GUI 的一部分或作为 CardLayout View 交换的一部分放置在 JDialog、JOptionPane、JApplet 中、另一个 JPanel 的内部....我可以继续下去。
  • 出于与上述相同的原因,我的许多 GUI 就是这样做的,创建 JPanel,我可以通过将它们放入小型测试程序中的 JFrames 中进行隔离测试,然后再将它们添加到更大的应用程序整体中。

关于java - 建立JFrame的语法。哪个是对的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17765258/

相关文章:

java - 我的 java 类验证不起作用,为什么?

java - 将 String 输入转换为 Double 并避免 java.lang.NumberFormatException

java - 如何迭代绘制分形?

Swift不支持多重继承,如何实现?

带自定义included_tags的Django模型继承

java - 制作更改密码的功能

java - 使用tomcat绑定(bind)LDAP进行多认证?

java - 如何从不同的表获取值到jTable.Netbeans和H2数据库

java - javax.swing.JFrame不包含setDefaultCLoseOperation

python - Numba jitclass 和继承