自定義類繼承 `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)` | 顯示**自己**這個窗口 |
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 歷史包袱。