我应该是否继承JFrame/JPanel?

Geo*_*lly 6 java swing

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

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

p.add(aComponent);
p.add(anotherComponent);
Run Code Online (Sandbox Code Playgroud)

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

Qwe*_*rky 6

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

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

为什么要费心延长JFrame?你没有添加任何东西!组合是一个更好的选择.

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

例如,假设您的GUI有2个主要显示区域; 一个带有一些按钮/控制/输入,另一个带有显示输出(例如在文本区域中).子类完全可以JPanel创建包含按钮/控件/输入的ControlPanel.这会将所有代码移动到一个漂亮的整齐模块中,清理包含和处理main的类JFrame.