圖形用戶界面 (GUI) 的核心是窗口。在 Swing 中,JFrame 是主窗口的標準實現。本文從窗口類型、構造方法、核心 API、組件添加機制、佈局管理五個維度,帶你快速掌握 Swing 窗口編程精髓。
| 類型 | 類 | 特徵 | 適用場景 |
|---|---|---|---|
| Applet 窗口 | Applet | 瀏覽器嵌入、生命週期由容器管理 | 歷史遺留、Web 嵌入(已淘汰) |
| 框架窗口 | JFrame | 標準窗口:標題欄、邊框、最小/最大/關閉按鈕、可拖拽縮放 | 桌面應用主窗口 |
| 無邊框窗口 | JWindow | 無標題欄、無邊框、純矩形區域 | 啟動畫面、通知彈窗、自定義裝飾窗口 |
// 構造
JFrame f1 = new JFrame(); // 無標題
JFrame f2 = new JFrame("我的窗口"); // 帶標題
// 核心設置
f.setSize(400, 300); // 寬高(像素)
f.setBounds(100, 100, 400, 300); // 位置 + 尺寸
f.setTitle("新標題"); // 動態改標題
f.setBackground(Color.WHITE); // 背景色
f.setResizable(false); // 禁止用戶調整大小
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 關閉退出 JVM
f.setVisible(true); // **默認不可見,必須顯式調用**
重點:JFrame、JDialog、JApplet 等頂級容器不能直接 add(component),必須通過內容面板:
JFrame frame = new JFrame();
frame.getContentPane().add(new JButton("按鈕")); // BorderLayout 默認居中
JPanel panel = new JPanel(new FlowLayout()); // 自定義佈局
panel.add(new JButton("按鈕1"));
panel.add(new JButton("按鈕2"));
frame.setContentPane(panel); // 替換默認內容面板
GlassPane(最上層攔截事件)、LayeredPane(分層)、ContentPane(放組件)、MenuBar。ContentPane 隔離組件管理,支援 setGlassPane 實現模態遮罩、拖拽反饋等高級效果。class MyWindow extends JFrame {
public MyWindow(String title, Component comp, Color bg, int w, int h) {
super(title); // 必須先調用父構造
setSize(w, h);
setDefaultCloseOperation(DISPOSE_ON_CLOSE); // 僅關閉當前窗口
Container cp = getContentPane();
cp.setLayout(new BorderLayout());
cp.add(comp, BorderLayout.CENTER);
cp.setBackground(bg);
}
}
// 使用
public static void main(String[] args) {
new MyWindow("窗口一", new JButton("按鈕A"), Color.CYAN, 300, 200).setVisible(true);
new MyWindow("窗口二", new JLabel("Hello", SwingConstants.CENTER), Color.PINK, 400, 300).setVisible(true);
}
| 佈局 | 特點 | 典型用途 |
|---|---|---|
BorderLayout | 五大區域:北/南/東/西/中,中間自動填滿 | 主窗口整體結構 |
FlowLayout | 左到右、上到下流式排列,居中對齊 | 工具欄、按鈕組 |
GridLayout | 規則網格,每格等大 | 計算器鍵盤、表單網格 |
BoxLayout | 單行/單列,支援彈性空間 | 側邊欄、表單垂直堆疊 |
GridBagLayout | 最強大:組件可跨行列、權重分配、錨點對齊 | 複雜表單、響應式界面 |
setVisible(true) → 窗口不顯示。frame.add(btn) → 拋異常或組件不顯示(JDK 1.5+ 自動轉發但不推薦)。pack() 前未添加組件 → 窗口尺寸為 0。setDefaultCloseOperation → 默認 HIDE_ON_CLOSE,關閉窗口進程不退出。public class AppMain {
public static void main(String[] args) {
// 1. 確保 GUI 創建在 EDT 上(線程安全)
SwingUtilities.invokeLater(() -> {
// 2. 設置系統觀感(可選)
try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); }
catch (Exception ignored) {}
// 3. 創建並顯示主窗口
JFrame frame = new MyMainFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
}
掌握 JFrame 與內容面板機制,是 Swing 開發的敲門磚。建議動手改寫本文示例,嘗試不同佈局、嵌套面板、添加菜單欄,快速建立「所見即所得」的 GUI 直覺。