Label trong Swing, dễ nhưng mà khó

Lớp JLabel trong Java Swing có thể hiển thị hoặc text, hoặc hình ảnh hoặc cả hai. Các nội dung của Label được gán bởi thiết lập căn chỉnh ngang và dọc trong khu vực hiển thị của nó. Theo mặc định, các label được căn chỉnh theo chiều dọc trong khu vực hiển thị. Theo mặc định, text-only label là căn chỉnh theo cạnh, image-only label là căn chỉnh theo chiều ngang.

Tạo Label trong Java Swing

Chúng ta có thể tạo một Label trong Swing thông qua các constructor sau:

public JLabel ()
public JLabel (java.lang.String text)
public JLabel (java.lang.String text, int horizontalAlignment)
public JLabel (Icon image)
public JLabel (Icon image, int horizontalAlignment)
public JLabel (Java.lang.String text, Icon icon, int horizontalAlignment)

Giá trị của horizontalAlignment có thể là một trong các giá trị sau:

  • SwingConstants.LEFT
  • SwingConstants.CENTER
  • SwingConstants.RIGHT
  • SwingConstants.LEADING
  • SwingConstants.TRAILING

Tuy nhiên việc căn chỉnh chỉ xảy ra khi layout manager còn khoảng trống để bố trí các component.

Dưới đây là đoạn code tạo Label với một String:

JLabel nameLabel  = new JLabel("Name:");
JLabel warningImage  = new JLabel(new Icon("C:/images/ok.gif"));

Nếu Label không được gán một đoạn văn bảng ngay từ đầu thì các bạn có thể gán sau đó với setText() method, hàm này cũng có thể dùng để cập nhật văn bản hiển thị của Label.

import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main {
  public static void main(String args[]) {
    JFrame f = new JFrame("Label Demo");
    f.setLayout(new FlowLayout());
    f.setSize(300, 200);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    JLabel label= new JLabel("https://shareprogramming.net//");
    f.add(label);
    f.setVisible(true);
  }
}

Mnemonic Key

Hàm setDisplayedMnemonic() dùng để tạo một mnemonic key cho Label, mnemonic key này sẽ được gạch chân để gợi ý cho người dùng.

Phương thức setLabelFor() nhận một instance của một component khác nhầm chỉ định rằng Label này được dùng để mô tả cho nó.

Trong đoạn mã sau, JLabel có mnemonic key là ký tự N. Khi người dùng nhấn Alt + N, JTextField thuộc về nó sẽ được focus.

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Main {
  public static void main(String[] args) {
    JFrame frame = new JFrame("JFrame");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JTextField nameTextField = new JTextField();
    JLabel nameLabel = new JLabel("Name:");
    nameLabel.setDisplayedMnemonic('N');
    nameLabel.setLabelFor(nameTextField);

    frame.add(nameLabel, BorderLayout.WEST);
    frame.add(nameTextField, BorderLayout.CENTER);

    frame.pack();
    frame.setVisible(true);
  }
}

Label với HTML

Bạn hoàn toàn có thể gán giá trị cho một label với một chuỗi HTML như sau:

import javax.swing.JFrame;
import javax.swing.JLabel;
public class Main {

    public static void main(String[] a) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JLabel label = new JLabel("<html>bold <br> plain</html>");
        frame.add(label);

        frame.setSize(300, 200);
        frame.setVisible(true);
    }

}

Căn chỉnh văn bản

Chúng ta có thể quản lý vị trí xuất hiện của văn bản trong Label. Ví dụ căn chỉnh label hiển thị giữa theo chiều dọc và chiều ngang.

label.setHorizontalAlignment(JLabel.CENTER);
label.setVerticalAlignment(JLabel.CENTER);

Vô hiệu hoá Label

Label thông thường dùng để mô tả cho một component nào đó có thể là JTextField chẳng hạn. Khi nó bị vô hiệu hoá thì Label mô tả cho nó cũng sẽ phải bị vô hiệu hoá theo phải không nào? Chúng ta chỉ cần dùng label.setEnabled(false) thì màu của nó sẽ chuyển sang nhạt hơn biểu thị cho việc nó đang bị vô hiệu hoá.

import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main {
  public static void main(String args[]) {
    JFrame f = new JFrame("Label Demo");
    f.setLayout(new FlowLayout());
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JLabel label= new JLabel("java2s.com");
    label.setEnabled(false);

    f.add(label);
    f.pack();
    f.setVisible(true);
  }
}

Tạo Border cho Label

Chúng ta có thể tạo Border cho Label cách đơn giản như sau:

JLabel label= new JLabel("A default label");
Border border = BorderFactory.createLineBorder(Color.BLACK);
label.setBorder(border);

Custom Label

Sau đây là một ví dụ chúng ta có thể custom một Jlabel trong swing để tạo ra một JLabel mà đoạn văn bản được gạch chân gọi là UnderlineLabel.

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

class UnderlinedLabel extends JLabel {
    public UnderlinedLabel() {
        this("");
    }

    public UnderlinedLabel(String text) {
        super(text);
    }

    public void paint(Graphics g) {
        Rectangle r;
        super.paint(g);
        r = g.getClipBounds();
        g.drawLine(0, r.height - getFontMetrics(getFont()).getDescent(), getFontMetrics(getFont())
                .stringWidth(getText()), r.height - getFontMetrics(getFont()).getDescent());
    }
}


public class Main {
    public static void main(String[] argv) throws Exception {
        UnderlinedLabel label = new UnderlinedLabel("Label Text");
        JFrame jFrame = new JFrame("Custom label");
        jFrame.setSize(400, 50);
        jFrame.getContentPane().add(label);
        jFrame.setLocationRelativeTo(null);
        jFrame.setVisible(true);
    }
}

Nguồn tham khảo

http://www.java2s.com/Tutorials/Java/Java_Swing/0720__Java_Swing_JLabel.htm

Leave a Comment

Your email address will not be published. Required fields are marked *