[Java swing] Sử dụng Border trong Java

Các border đơn giản
Các border mở
Các border có tiêu đề
Kết hợp các loại border

Lâu lâu chưa viết bài về Swing, trong bài viết này mình sẽ hướng dẫn các bạn tìm hiểu cách dùng của Border. Nói nôm na là các đường viền trong Java. Chúng ta sẽ lần lượt đi tìm hiểu 4 thể loại đường viền như bên đã liệt kê.

Sử dụng simple border

Để tạo các Border, các bạn sử dụng cú pháp sau và tùy vào các loại border bạn muốn tạo.
Border border = BorderFactory.create…
Bây giờ chúng ta sẽ code để tạo ra một số loại border đơn giản như hình dưới đây.

use simple border in java

Line border là loại border nét liền với màu sắc nào đó
Empty border là border trống, nó thường được dùng để tạo khoảng trống, công dụng như sử dụng padding để đặt khoảng cách giữa nội dung và bên ngoài.
Raised etched border là dạng border nét nổi, khắc nổi lên trên.
Lowered etched border là border khắc nhưng chìm xuống dưới.
Raised bevel border là border dạng tạo góc xiên nổi lên.
Lowered bevel border là border dạng tạo góc chìm xuống.

package nguyenvanquan7826.border;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;

/**
 * --------------------- @author nguyenvanquan7826 ---------------------
 * ------------------ website: cachhoc.net -------------------
 */
public class DemoSimpleBorders extends JFrame {

  /** create border type */

  private Border lineBorder = BorderFactory.createLineBorder(Color.blue);
  private Border raisedEtched = BorderFactory
      .createEtchedBorder(EtchedBorder.RAISED);
  private Border loweredEtched = BorderFactory
      .createEtchedBorder(EtchedBorder.LOWERED);
  private Border raisedBevel = BorderFactory.createRaisedBevelBorder();
  private Border loweredBevel = BorderFactory.createLoweredBevelBorder();
  private Border empty = BorderFactory.createEmptyBorder();

  /**
   * create border empty for JPanel contain content
   */
  private Border panelBorder = BorderFactory
      .createEmptyBorder(20, 20, 20, 20);

  public DemoSimpleBorders() {
    add(createContent());
    setDisplay();
  }

  private void setDisplay() {
    setTitle("Demo Simple Border");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pack();
    setLocationRelativeTo(null);
    setVisible(true);
  }

  /**
   * create JPanel contain six JPanel with borders
   */
  private JPanel createContent() {
    JPanel panel = new JPanel(new GridLayout(3, 2, 10, 10));
    panel.setBorder(panelBorder);
    panel.add(createPaneBorder(lineBorder, "line border"));
    panel.add(createPaneBorder(empty, "empty border"));
    panel.add(createPaneBorder(raisedEtched, "raised etched"));
    panel.add(createPaneBorder(loweredEtched, "lowered etched border"));
    panel.add(createPaneBorder(raisedBevel, "raised bevel border"));
    panel.add(createPaneBorder(loweredBevel, "lowered bevel border"));
    return panel;
  }

  /**
   * create JPanel contain a border
   */
  private JPanel createPaneBorder(Border border, String content) {
    JPanel panel = new JPanel(new BorderLayout());
    panel.setBorder(border);
    JLabel lb = new JLabel(content, JLabel.CENTER);
    panel.add(lb);
    return panel;
  }

  public static void main(String[] args) {
    new DemoSimpleBorders();
  }
}

Sử dụng matte border

Matte Border là một dạng cho phép chúng ta sử dụng màu hoặc hình ảnh tạo ra đường viền. Ngoài ra nó còn cho chúng ta đặt kích thước cho các cạnh nữa. Tuy nhiên khi dùng hình ảnh thì bạn nên đặt các số liệu về kích thước là -1 khi đó kích thước sẽ hiện nguyên dạng, không bị mất. Code ví dụ nhé.

matte border in java

package nguyenvanquan7826.border;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.net.URL;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;

/**
 * --------------------- @author nguyenvanquan7826 ---------------------
 * ------------------ website: cachhoc.net -------------------
 */
public class DemoMatteBorder extends JFrame {

  private Border matteBorderColor;
  private Border matteBorderIcon;

  /**
   * create border empty for JPanel contain content
   */
  private Border panelBorder = BorderFactory
      .createEmptyBorder(20, 20, 20, 20);

  public DemoMatteBorder() {
    createBorder();
    add(createContent());
    setDisplay();
  }

  private void setDisplay() {
    setTitle("Demo Matte Border");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pack();
    setLocationRelativeTo(null);
    setVisible(true);
  }

  /**
   * create JPanel contain six JPanel with borders
   */
  private JPanel createContent() {
    JPanel panel = new JPanel(new GridLayout(2, 1, 10, 10));
    panel.setBorder(panelBorder);

    panel.add(createPaneBorder(matteBorderColor, "matte border with color"));
    if (matteBorderIcon != null) {
      panel.add(createPaneBorder(matteBorderIcon,
          "matte border with icon"));
    } else {
      panel.add(createPaneBorder(matteBorderColor, "don't found icon"));
    }

    return panel;
  }

  /**
   * create JPanel contain a border
   */
  private JPanel createPaneBorder(Border border, String content) {
    JPanel panel = new JPanel(new BorderLayout());
    panel.setBorder(border);
    JLabel lb = new JLabel(content, JLabel.CENTER);
    panel.add(lb);
    return panel;
  }

  /**
   * create types border
   */
  private void createBorder() {
    matteBorderColor = BorderFactory.createMatteBorder(1, 1, 5, 5,
        Color.blue);
    ImageIcon icon = createIcon("icon.gif");
    if (icon != null) {
      matteBorderIcon = BorderFactory.createMatteBorder(-1, -1, -1, -1,
          icon);
    }
  }

  /**
   * create a icon from a path
   */
  private ImageIcon createIcon(String path) {
    URL url = getClass().getResource(path);
    if (url != null) {
      return new ImageIcon(url);
    } else {
      return null;
    }
  }

  public static void main(String[] args) {
    new DemoMatteBorder();
  }
}

Sử dụng title border

Title Border là dạng border có tiêu đề. Bạn có thể đặt tiêu đề ở trái, phải, giữa, trên dưới border,… Ngoài ra bạn còn có thể đặt cái border là một trong các dạng border nào đó mà đã được tạo ra, nếu không thì mặc định border sẽ là màu blue mờ mờ.

title border in java

package nguyenvanquan7826.border;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;

/**
 * --------------------- @author nguyenvanquan7826 ---------------------
 * ------------------ website: cachhoc.net -------------------
 */
public class DemoTitleBorder extends JFrame {

  /**
   * create border empty for JPanel contain content
   */
  private Border panelBorder = BorderFactory
      .createEmptyBorder(20, 20, 20, 20);

  public DemoTitleBorder() {
    add(createContent());
    setDisplay();
  }

  private void setDisplay() {
    setTitle("Demo Title Border");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pack();
    setLocationRelativeTo(null);
    setVisible(true);
  }

  /**
   * create JPanel contain six JPanel with borders
   */
  private JPanel createContent() {
    JPanel panel = new JPanel(new GridLayout(6, 1, 10, 10));
    panel.setBorder(panelBorder);

    Border titleBorder;
    Border blueBorder = BorderFactory.createLineBorder(Color.BLUE);

    titleBorder = BorderFactory.createTitledBorder("title");
    panel.add(createPaneBorder(titleBorder, "default title border"));

    titleBorder = BorderFactory.createTitledBorder(blueBorder, "title");
    panel.add(createPaneBorder(titleBorder, "title border with color blue"));

    titleBorder = BorderFactory.createTitledBorder(blueBorder, "title",
        TitledBorder.CENTER, TitledBorder.DEFAULT_POSITION);
    panel.add(createPaneBorder(titleBorder,
        "title border center just and default prsition"));

    titleBorder = BorderFactory.createTitledBorder(null, "title",
        TitledBorder.CENTER, TitledBorder.ABOVE_TOP);
    panel.add(createPaneBorder(titleBorder,
        "title border center just and above top"));

    titleBorder = BorderFactory.createTitledBorder(blueBorder, "title",
        TitledBorder.RIGHT, TitledBorder.BELOW_TOP);
    panel.add(createPaneBorder(titleBorder,
        "title border right just and below top"));

    titleBorder = BorderFactory.createTitledBorder(null, "title",
        TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.BELOW_BOTTOM);
    panel.add(createPaneBorder(titleBorder,
        "title border default just and below bottom"));

    return panel;
  }

  /**
   * create JPanel contain a border
   */
  private JPanel createPaneBorder(Border border, String content) {
    JPanel panel = new JPanel(new BorderLayout());
    panel.setBorder(border);
    JLabel lb = new JLabel(content, JLabel.CENTER);
    panel.add(lb);
    return panel;
  }

  public static void main(String[] args) {
    new DemoTitleBorder();
  }
}

Sử dụng Compound border

Compound Border là sự kết hợp các border lại với nhau. Chúng ta có thể sử dụng nó để tạo ra các border đẹp theo ý muốn hoặc có thể tạo padding hoặc margin nội dung với border qua việc kết hợp empty border với các border khác bằng Compound border.

title border in java

package nguyenvanquan7826.border;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;

/**
 * --------------------- @author nguyenvanquan7826 ---------------------
 * ------------------ website: cachhoc.net -------------------
 */
public class DemoCompoundBorder extends JFrame {

	/** create border type */

	private Border lineBorder = BorderFactory.createLineBorder(Color.blue);
	private Border raisedBevel = BorderFactory.createRaisedBevelBorder();
	private Border loweredBevel = BorderFactory.createLoweredBevelBorder();

	/**
	 * create border empty for JPanel contain content
	 */
	private Border panelBorder = BorderFactory
			.createEmptyBorder(20, 20, 20, 20);

	public DemoCompoundBorder() {
		add(createContent());
		setDisplay();
	}

	private void setDisplay() {
		setTitle("Demo Compound Border");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		setLocationRelativeTo(null);
		setVisible(true);
	}

	/**
	 * create JPanel contain six JPanel with borders
	 */
	private JPanel createContent() {
		JPanel panel = new JPanel(new GridLayout(3, 1, 10, 10));
		panel.setBorder(panelBorder);

		Border compound = BorderFactory.createCompoundBorder(raisedBevel,
				loweredBevel);
		panel.add(createPaneBorder(compound, "raisedBevel and loweredBevel"));

		compound = BorderFactory.createCompoundBorder(lineBorder, compound);
		panel.add(createPaneBorder(compound, "add lineBorder to compound"));

		Border titleBorder = BorderFactory.createTitledBorder(compound,
				"title", TitledBorder.CENTER, TitledBorder.DEFAULT_POSITION);
		panel.add(createPaneBorder(titleBorder, "title border with compound"));

		return panel;
	}

	/**
	 * create JPanel contain a border
	 */
	private JPanel createPaneBorder(Border border, String content) {
		JPanel panel = new JPanel(new BorderLayout());
		panel.setBorder(border);
		JLabel lb = new JLabel(content, JLabel.CENTER);
		panel.add(lb);
		return panel;
	}

	public static void main(String[] args) {
		new DemoCompoundBorder();
	}
}

Bài viết thực hiện trong loạt bài hướng dẫn java swing.

Tham khảo và đọc thêm: use border BorderFactory