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

Java Swing 佈局管理器實戰(二):FlowLayout、BorderLayout、GridLayout 核心三大佈局全解析

     編輯:Java 綜合教學

FlowLayout — 流式佈局

最簡單的佈局管理器,組件按添加順序從左到右、自動換行,類似文字排版。默認居中對齊。

構造方法與參數

new FlowLayout()                          // 默認:居中,hgap=5, vgap=5
new FlowLayout(int align)                 // 對齊:LEFT/CENTER/RIGHT
new FlowLayout(int align, int hgap, int vgap) // 完全控制

實戰示例

public class FlowLayoutDemo extends JFrame {
    public FlowLayoutDemo() {
        setTitle("FlowLayout - 右對齊、間距 10px");
        setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 10));
        
        for (int i = 0; i < 12; i++) {
            add(new JButton("Btn " + i));
        }
        
        setSize(350, 200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(FlowLayoutDemo::new);
    }
}

BorderLayout — 邊界佈局

將容器劃分為五大區域:NORTH、SOUTH、WEST、EAST、CENTER。CENTER 區域自動填滿剩餘空間,最常放置主內容區(表格、編輯器、滾動面板)。

添加組件指定區域

container.add(component, BorderLayout.CENTER);  // 或
container.add(component, "Center"); // 字符串常量也可

實戰示例:經典主窗口結構

public class BorderLayoutDemo extends JFrame {
    public BorderLayoutDemo() {
        setTitle("BorderLayout - 經典主窗口");
        setLayout(new BorderLayout(5, 5)); // hgap, vgap
        
        // 頂部工具欄
        JToolBar toolbar = new JToolBar();
        toolbar.add(new JButton("新建"));
        toolbar.add(new JButton("打開"));
        toolbar.add(new JButton("保存"));
        add(toolbar, BorderLayout.NORTH);
        
        // 左側導航樹
        JTree tree = new JTree();
        add(new JScrollPane(tree), BorderLayout.WEST);
        
        // 中心工作區
        JTextArea editor = new JTextArea();
        add(new JScrollPane(editor), BorderLayout.CENTER);
        
        // 右側屬性面板
        JPanel props = new JPanel(new GridLayout(0,1));
        props.setBorder(BorderFactory.createTitledBorder("屬性"));
        add(props, BorderLayout.EAST);
        
        // 底部狀態欄
        JLabel status = new JLabel("就緒 ");
        status.setBorder(BorderFactory.createEmptyBorder(0,5,0,5));
        add(status, BorderLayout.SOUTH);
        
        setSize(800, 600);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(BorderLayoutDemo::new);
    }
}

GridLayout — 網格佈局

將容器劃分為規則矩形網格,每個單元格大小完全相同,組件按行優先順序填充。適合計算器鍵盤、表單網格、圖標面板等。

構造方法

new GridLayout(int rows, int cols)           // 行、列,一個可為 0 表示不限
new GridLayout(int rows, int cols, int hgap, int vgap) // 帶間距

實戰示例:計算器鍵盤

public class GridLayoutDemo extends JFrame {
    public GridLayoutDemo() {
        setTitle("GridLayout - 計算器鍵盤");
        // 4行4列,間距5px,行數固定4,列數0表示自動計算(此處相同)
        setLayout(new GridLayout(4, 4, 5, 5));
        
        String[] keys = {
            "7","8","9","/",
            "4","5","6","*",
            "1","2","3","-",
            "0",".","=","+"
        };
        
        for (String key : keys) {
            JButton btn = new JButton(key);
            btn.setFont(btn.getFont().deriveFont(18f));
            add(btn);
        }
        
        setSize(300, 350);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(GridLayoutDemo::new);
    }
}

三大佈局對比速查

特性FlowLayoutBorderLayoutGridLayout
佈局邏輯流式換行五區域分割規則網格
組件尺寸優先尺寸CENTER自適應,其餘優先尺寸強制等分
響應縮放自動換行CENTER自適應最佳等比縮放
典型場景工具欄、按鈕組、標簽組主窗口、對話框、分割面板計算器、表單網格、圖標牆
嵌套靈活性高極高(區域再嵌套)中

佈局組合實戰:嵌套構建複雜界面

真實項目中通過面板嵌套組合多種佈局:

// 主窗口:BorderLayout
JPanel main = new JPanel(new BorderLayout());

// 頂部:FlowLayout 工具欄
JPanel toolbar = new JPanel(new FlowLayout(FlowLayout.LEFT));
toolbar.add(new JButton("A")); toolbar.add(new JButton("B"));
main.add(toolbar, BorderLayout.NORTH);

// 中心:GridLayout 表單
JPanel form = new JPanel(new GridLayout(3, 2, 5, 5));
form.add(new JLabel("用戶名:")); form.add(new JTextField());
form.add(new JLabel("郵箱:")); form.add(new JTextField());
form.add(new JLabel("電話:")); form.add(new JTextField());
main.add(form, BorderLayout.CENTER);

// 底部:FlowLayout 右對齊按鈕組
JPanel btns = new JPanel(new FlowLayout(FlowLayout.RIGHT));
btns.add(new JButton("取消")); btns.add(new JButton("確定"));
main.add(btns, BorderLayout.SOUTH);

避坑指南

  • BorderLayout 重複添加同區域:後添加者覆蓋前者,僅保留最後一個
  • GridLayout 行列同時指定非零:以行數為準,列數自動調整(new GridLayout(3, 2) 實際可能 3x3)
  • FlowLayout 組件過大:不會壓縮組件,導致單行只能放一個,檢查 getPreferredSize()
  • 忘記 setLayout:JFrame/JDialog 默認 BorderLayout,JPanel 默認 FlowLayout
  • 間距單位:均為像素,高 DPI 下建議根據縮放因子動態計算

進階推薦

  • GridBagLayout:功能最強大、最靈活,學習曲線陡峭
  • BoxLayout:單行/單列強制排列,配合 Box.createGlue()、Strut、RigidArea 實現彈性佈局
  • MigLayout (第三方):字符串約束 DSL,"wrap 2, gap 10",極其簡潔強大,現代 Swing 開發首選

掌握 FlowLayout、BorderLayout、GridLayout 三大核心佈局及其組合嵌套,足以應對 90% 的 Swing 界面開發需求。下一節將探討事件處理機制與監聽器模式。

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