0

Series Java Swing Bài 5: Nhúng HTML và thay đổi Icon, Cursor mặc định cho ứng dụng

Giao diện mặc định của Java Swing đôi khi khá đơn điệu với icon "tách cà phê" của Java và văn bản chỉ có một màu, một kích cỡ. Trước khi đi sâu vào việc tự vẽ đồ họa phức tạp, bạn có thể dùng 3 thủ thuật cực kỳ hiệu quả sau để "trang điểm" cho ứng dụng.

1. Nhúng HTML vào Component

Hầu hết các thành phần hiển thị văn bản của Swing (như JLabel, JButton, JCheckBox, JToolTip) đều tích hợp sẵn một trình render HTML thu gọn (tương thích HTML 3.2).

Điểm yếu lớn nhất của JLabel hoặc JButton là không hỗ trợ ký tự xuống dòng \n. Nhúng HTML là cách nhanh nhất để tạo văn bản nhiều dòng, đổi màu từng chữ, hoặc in đậm/in nghiêng mà không cần dùng đến JTextPane.

Quy tắc: Chuỗi văn bản truyền vào phải bắt đầu bằng thẻ <html>.

Java

// Tạo văn bản nhiều dòng, in đậm và tô màu
String htmlText = "<html>"
                + "Dòng 1: <b>Văn bản in đậm</b><br>"
                + "Dòng 2: <font color='red'>Chữ màu đỏ</font> và <i>in nghiêng</i>"
                + "</html>";

JLabel label = new JLabel(htmlText);

// Tạo nút bấm có giao diện phức tạp bằng HTML
JButton btn = new JButton("<html>Duyệt<br><b>Danh sách</b></html>");

2. Thay đổi Icon ứng dụng (Application Icon)

Mặc định, cửa sổ JFrame sẽ hiển thị logo cốc cà phê của Java ở góc trên cùng bên trái và dưới thanh Taskbar. Để thay đổi logo này sang icon thương hiệu của riêng bạn, hãy sử dụng phương thức setIconImage().

Kỹ thuật quan trọng: Không nên dùng đường dẫn tuyệt đối (như C:\\images\\icon.png) vì khi đóng gói thành file .jar mang sang máy khác sẽ bị lỗi không tìm thấy file. Hãy tải ảnh qua getResource() để đọc file ảnh nằm trực tiếp bên trong cấu trúc thư mục project (trong thư mục src hoặc resources).

Java

import javax.imageio.ImageIO;
import java.awt.Image;
import java.net.URL;

// ... (Bên trong hàm khởi tạo hoặc cấu hình JFrame)
try {
    // Đọc file logo.png nằm cùng cấp thư mục hoặc trong resources
    URL iconURL = getClass().getResource("/logo.png"); 
    if (iconURL != null) {
        Image icon = ImageIO.read(iconURL);
        this.setIconImage(icon); // "this" đại diện cho JFrame hiện tại
    }
} catch (Exception e) {
    e.printStackTrace(); // Bỏ qua nếu lỗi đọc ảnh, giữ nguyên icon mặc định
}

3. Thay đổi Con trỏ chuột (Cursor)

Để tăng trải nghiệm người dùng (UX), khi rê chuột qua các thành phần có thể click được (như Text mang tính chất link liên kết, hoặc Button đặc biệt), con trỏ chuột mặc định (mũi tên) nên đổi thành hình bàn tay.

Swing cung cấp lớp Cursor với rất nhiều hằng số xây dựng sẵn:

Java

// Đổi trỏ chuột thành hình bàn tay (thường dùng cho nút bấm / link)
button.setCursor(new Cursor(Cursor.HAND_CURSOR));

// Đổi trỏ chuột thành biểu tượng đồng hồ cát / loading báo hiệu đang xử lý
frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));

// Đổi trỏ chuột thành dấu thập (khi vẽ hình hoặc chọn vùng)
panel.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));

// Đưa trỏ chuột về trạng thái mũi tên mặc định
frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));

4. Source code tổng hợp

Đoạn code dưới đây tích hợp cả 3 kỹ thuật: một cửa sổ có icon tùy chỉnh (giả định), một nhãn văn bản đa sắc màu bằng HTML, và một nút bấm biến trỏ chuột thành hình bàn tay khi lướt qua.

Java

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

public class CustomUIFrame extends JFrame {

    public CustomUIFrame() {
        setTitle("Swing HTML & Icon Demo");
        setSize(400, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setLayout(new FlowLayout(FlowLayout.CENTER, 20, 20));

        // 1. Tùy chỉnh Icon (Thay URL bằng link thực tế hoặc file trong resource của bạn)
        try {
            // Lấy ảnh tạm từ internet để demo
            URL url = new URL("https://cdn-icons-png.flaticon.com/64/226/226777.png");
            ImageIcon icon = new ImageIcon(url);
            setIconImage(icon.getImage());
        } catch (Exception ex) {
            System.out.println("Không thể tải icon");
        }

        // 2. Nhúng HTML vào JLabel
        String htmlContent = "<html>"
                + "<div style='text-align: center; font-family: Arial;'>"
                + "Chào mừng đến với <span style='color: blue; font-size: 16px;'>Java Swing</span><br>"
                + "<i>Dòng văn bản này được xử lý bằng <b>HTML</b></i>"
                + "</div></html>";
        JLabel htmlLabel = new JLabel(htmlContent);

        // 3. Thay đổi Cursor cho JButton
        JButton actionButton = new JButton("Rê chuột vào đây!");
        actionButton.setCursor(new Cursor(Cursor.HAND_CURSOR));

        // Thêm vào JFrame
        add(htmlLabel);
        add(actionButton);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new CustomUIFrame().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í