0

Series Java Swing Bài 7: BorderLayout: Chia cửa sổ thành 5 vùng không gian chuẩn.

BorderLayout là một trong những Layout Manager quyền lực và được sử dụng nhiều nhất trong Java Swing. Khác với sự tự do của FlowLayout, BorderLayout chia không gian làm việc thành 5 vùng địa lý cố định: Bắc (North), Nam (South), Đông (East), Tây (West) và Trung tâm (Center).

Đặc biệt lưu ý: BorderLayout chính là bố cục mặc định của JFrame. Nếu bạn không set layout cho cửa sổ, nó đang âm thầm sử dụng BorderLayout.


1. Bản Đồ 5 Vùng Của BorderLayout

Mỗi vùng trong BorderLayout có một quy tắc co giãn (sizing behavior) cực kỳ nghiêm ngặt. Khi bạn phóng to hoặc thu nhỏ cửa sổ, các Component sẽ bị kéo giãn theo quy tắc của vùng chứa nó.

Vùng (Region) Hành vi co giãn (Sizing Behavior) Ứng dụng thực tế phổ biến
BorderLayout.NORTH Kéo giãn lấp đầy chiều ngang, giữ nguyên chiều cao gốc. Thanh menu (MenuBar), Thanh công cụ (Toolbar).
BorderLayout.SOUTH Kéo giãn lấp đầy chiều ngang, giữ nguyên chiều cao gốc. Thanh trạng thái (Status bar), Nơi chứa nút Submit/Cancel.
BorderLayout.WEST Kéo giãn lấp đầy chiều dọc, giữ nguyên chiều rộng gốc. Thanh điều hướng (Sidebar), Cây thư mục (JTree).
BorderLayout.EAST Kéo giãn lấp đầy chiều dọc, giữ nguyên chiều rộng gốc. Bảng thuộc tính (Properties panel), Quảng cáo.
BorderLayout.CENTER Chiếm đoạt toàn bộ không gian còn lại (cả ngang và dọc). Vùng làm việc chính (Bảng JTable, Khung soạn thảo văn bản).

2. Hai Quy Tắc Ngầm Định Bắt Buộc Phải Nhớ

  1. Mỗi vùng chỉ chứa ĐƯỢC 1 Component duy nhất: Nếu bạn cố tình add() hai nút bấm vào cùng một vùng NORTH, nút bấm thứ hai sẽ "đè bẹp" và xóa sổ nút bấm thứ nhất. Để lách luật, bạn phải nhét nhiều nút bấm vào một cái hộp JPanel (dùng FlowLayout), rồi mang cả cái hộp đó đặt vào vùng NORTH.
  2. Không bắt buộc phải dùng đủ 5 vùng: Bạn có thể chỉ dùng vùng NORTH và CENTER. Các vùng bị bỏ trống (WEST, EAST, SOUTH) sẽ tự động biến mất và nhường lại không gian cho vùng CENTER phình to ra.

3. Khởi Tạo Và Sử Dụng

Cũng giống như FlowLayout, bạn có thể chỉ định khoảng cách (gap) giữa các vùng ngay khi khởi tạo:

  • BorderLayout(): Khởi tạo mặc định, các vùng nằm sát rịt vào nhau (khoảng cách = 0px).
  • BorderLayout(int hgap, int vgap): Khởi tạo với khoảng cách ngang (hgap) và dọc (vgap) tính bằng pixel.

4. Source Code Minh Họa

Đoạn code dưới đây trực quan hóa 5 vùng của BorderLayout. Khi chạy code, bạn hãy thử dùng chuột kéo giãn cửa sổ để quan sát xem nút bấm nào bị kéo giãn theo chiều ngang, nút nào bị kéo chiều dọc.

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

public class BorderLayoutDemo extends JFrame {

    public BorderLayoutDemo() {
        setTitle("Demo BorderLayout");
        setSize(500, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        // Khởi tạo BorderLayout với khoảng cách giữa các vùng là 10 pixel
        setLayout(new BorderLayout(10, 10));

        // Tạo 5 nút bấm tượng trưng cho 5 vùng
        JButton btnNorth = new JButton("Vùng NORTH (Bắc) - Dãn ngang");
        JButton btnSouth = new JButton("Vùng SOUTH (Nam) - Dãn ngang");
        JButton btnWest = new JButton("Vùng WEST (Tây) - Dãn dọc");
        JButton btnEast = new JButton("Vùng EAST (Đông) - Dãn dọc");
        
        JButton btnCenter = new JButton("Vùng CENTER (Trung tâm) - Phình to mọi hướng");
        btnCenter.setBackground(Color.LIGHT_GRAY); // Tô màu để dễ phân biệt
        btnCenter.setOpaque(true);

        // Đặt các Component vào đúng vị trí tọa độ
        add(btnNorth, BorderLayout.NORTH);
        add(btnSouth, BorderLayout.SOUTH);
        add(btnWest, BorderLayout.WEST);
        add(btnEast, BorderLayout.EAST);
        add(btnCenter, BorderLayout.CENTER);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new BorderLayoutDemo().setVisible(true);
        });
    }
}

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí