首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 繼承 Frame:自定義類就是 Frame,add 直接加到自己身上

     編輯:程式設計綜合問答

核心結論

自定義類繼承 `Frame` 後,該類的實例**就是一個 `Frame` 窗口**。調用 `add(component)` 等同於 `this.add(component)`,組件直接添加到這個窗口實例上。

代碼驗證

import java.awt.*;
import javax.swing.*;

public class MyFrame extends Frame {
    public MyFrame() {
        setTitle("繼承 Frame 測試");
        setSize(400, 300);
        setLayout(new FlowLayout());
        
        // 直接 add,無需指定對象
        add(new Button("按鈕 1"));
        add(new Button("按鈕 2"));
        add(new TextField(20));
        
        // 匿名內部類關閉窗口
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent e) { dispose(); }
        });
        
        setVisible(true);
    }
    
    public static void main(String[] args) {
        new MyFrame(); // 彈出一個包含三個組件的窗口
    }
}

關鍵點解析

代碼含義
`class MyFrame extends Frame``MyFrame` 擁有 `Frame` 所有屬性/方法(標題、大小、佈局、組件容器)
`add(btn)`隱式 `this.add(btn)`,組件加入 `MyFrame` 實例的容器層
`setLayout(new FlowLayout())`設置**自己**的佈局管理器
`setVisible(true)`顯示**自己**這個窗口

常見誤區

  • ❌ **以為必須 `new Frame()` 再 `frame.add(...)`** → 繼承後 `this` 就是那個 `Frame`,額外 `new` 會產生**兩個**窗口。
  • ❌ **在構造器中 `this.setVisible(true)` 前忘記添加組件** → 窗口顯示空白,後加組件需 `revalidate()`/`repaint()`。
  • ❌ **混淆 `Frame` (AWT) 與 `JFrame` (Swing)** → 新代碼建議繼承 `JFrame`,雙緩衝、鋪裝、鍵盤綁定更完善。

現代寫法:繼承 JFrame

public class MySwingFrame extends JFrame {
    public MySwingFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 關鍵:關閉即退出 JVM
        setTitle("Swing 版");
        setSize(400, 300);
        setLayout(new FlowLayout());
        add(new JButton("Swing Button"));
        add(new JTextField(20));
        setLocationRelativeTo(null); // 居中
        setVisible(true);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(MySwingFrame::new); // EDT 安全啟動
    }
}

總結

繼承 `Frame`/`JFrame` 的類**本身就是窗口**。構造器中直接 `add` 組件、`setLayout`、`setVisible`,無需額外實例。新項目請用 `JFrame` + `SwingUtilities.invokeLater`,避開 AWT 歷史包袱。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved