首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Swing 窗口編程入門:JFrame、容器、佈局與組件添加全攻略

     編輯:Java 相關知識

圖形用戶界面 (GUI) 的核心是窗口。在 Swing 中,JFrame 是主窗口的標準實現。本文從窗口類型、構造方法、核心 API、組件添加機制、佈局管理五個維度,帶你快速掌握 Swing 窗口編程精髓。

一、三種窗口類型對比

類型類特徵適用場景
Applet 窗口Applet瀏覽器嵌入、生命週期由容器管理歷史遺留、Web 嵌入(已淘汰)
框架窗口JFrame標準窗口:標題欄、邊框、最小/最大/關閉按鈕、可拖拽縮放桌面應用主窗口
無邊框窗口JWindow無標題欄、無邊框、純矩形區域啟動畫面、通知彈窗、自定義裝飾窗口

二、JFrame 構造與核心配置 API

// 構造
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);                 // **默認不可見,必須顯式調用**

三、Swing 容器與組件添加的「內容面板」規則

重點:JFrame、JDialog、JApplet 等頂級容器不能直接 add(component),必須通過內容面板:

方式一:獲取內容面板再添加(最常用)

JFrame frame = new JFrame();
frame.getContentPane().add(new JButton("按鈕")); // BorderLayout 默認居中

方式二:自定義 JPanel 作為內容面板

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 實現模態遮罩、拖拽反饋等高級效果。

四、完整示例:派生 JFrame 實現可復用窗口類

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最強大:組件可跨行列、權重分配、錨點對齊複雜表單、響應式界面

六、常見新手錯誤避坑

  1. 忘記 setVisible(true) → 窗口不顯示。
  2. 直接 frame.add(btn) → 拋異常或組件不顯示(JDK 1.5+ 自動轉發但不推薦)。
  3. 在構造器中調用 pack() 前未添加組件 → 窗口尺寸為 0。
  4. 未設置 setDefaultCloseOperation → 默認 HIDE_ON_CLOSE,關閉窗口進程不退出。
  5. 主線程結束導致程序退出:Swing 應用靠事件分發線程 (EDT) 存活,主線程結束無影響。

七、最佳實踐模板

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 直覺。

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