java - 我是否应该子类化 JFrame/JPanel?

标签 java swing

我习惯于在其他编程环境中对窗口类进行子类化,但在 java 教程中我通常会看到类似的东西

JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));

p.add(aComponent);
p.add(anotherComponent);

那么 Java 中关于子类化顶级容器类的约定是什么?

最佳答案

使用与所有 Java 类相同的原则。如果您正在修改或扩展行为或功能,那么一定要扩展 JPanelJFrame。诀窍是仔细考虑并决定你是否真的要添加任何东西。在 大多数 情况下,当我看到人们扩展 JFrame 时,这是不必要和错误的;

public class MyFrame extends JFrame {
  public static void main(String[] args) {
    new MyFrame().setVisible(true);
  }
}

为什么要扩展 JFrame?你还没有添加任何东西!组合是一个更好的选择。

扩展 JPanel 有点不同。 JPanel 是一个相当抽象的概念,它只是其他组件的通用容器。恕我直言,将 JPanel 子类化以创建更具体的面板,然后在您的应用程序中使用它是有效的。它促进了 OOP 和封装。

例如,假设您的 GUI 有 2 个主要显示区域;一个带有一些按钮/控件/输入,另一个显示输出(例如在文本区域中)。将 JPanel 子类化以创建包含按钮/控件/输入的 ControlPanel 是完全可以接受的。这会将所有代码移动到一个简洁的模块中,清理包含并处理主要 JFrame 的类。

关于java - 我是否应该子类化 JFrame/JPanel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5895282/

相关文章:

java - 在此代码示例中,AssetManager 类成员是否会被 JVM 垃圾回收?

java - 通过正则表达式使用 'contains check'

java - 如何在不同的类中设置两个具有相同 JPanel 内容的 JScrollPanes

java - 如何告诉 JAVA Selenium WebDriver 在没有 Thread.sleep() 的情况下等待特定时间段

java - 如何从返回 double 组的方法中获取所有 double 值?

java - JTextPane/JEditorPane 和奇怪的文本问题

java - JComboBox getSelectedIndex 不工作两次?

java - 在 JPanel 中实例化 JApplet 实例?

java - 如何在 Amazon EC2 上部署 Eclipse Java Web 动态项目?

java - 从特定文件夹生成随机图像