[JavaSwing] Sự khác nhau giữa LEFT và LEADING, RIGHT và TRAILING

Như các bạn đã biết về cách căn chỉnh lề của các đối tượng trong một Layout, cụ thể là ở bài FlowLayout đã đề cập đến nó. Khi mới sử dụng nhiều bạn sẽ không phân biệt được sự khác nhau giữa LEFT và LEADING, RIGHT và TRAILING. Trong bài viết này chúng ta sẽ tìm hiểu điều đó.

Mặc các đối tượng của chúng ta được sắp xếp trong Container (ComponentOrientation) là left-to-right/top-to-bottom, với FlowLayout thì đó là left-to-right. Chúng ta sẽ xem xét 2 Ví dụ sau đây:

Khi ComponentOrientation là left-to-right

Ví dụ sau sẽ tạo ra 1 JPanel (main panel) chứa 5 JPanel (item panel), mỗi item panel này sẽ được đặt FLowLayout với cách căn lề khác nhau và chứa một JLabel (có text và icon) để thể hiện được sự căn lề của chúng.

package Align;

import java.awt.ComponentOrientation;
import java.awt.FlowLayout;
import java.awt.GridLayout;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MyOrientation extends JFrame {

	public MyOrientation() {
		createJFrame();
	}

	private void createJFrame() {
		setTitle("Orientation left to right");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(500, 500);

		// add content to JFrame
		add(createMainPanel());

		setLocationRelativeTo(null);
		setVisible(true);
	}

	private JPanel createMainPanel() {
		// create main panel
		JPanel panel = new JPanel(new GridLayout(5, 1, 5, 5));
		// add panels item with align
		panel.add(cereateItemPanel(FlowLayout.LEFT, "LEFT"));
		panel.add(cereateItemPanel(FlowLayout.CENTER, "CENTER"));
		panel.add(cereateItemPanel(FlowLayout.RIGHT, "RIGHT"));
		panel.add(cereateItemPanel(FlowLayout.LEADING, "LEADING"));
		panel.add(cereateItemPanel(FlowLayout.TRAILING, "TRAILING"));
		return panel;
	}

	// create JPanel with align and JLabel title
	private JPanel cereateItemPanel(int align, String title) {
		// create JPanel
		JPanel panel = new JPanel(createFlowLayout(align));
		// set Component Orientation
		panel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
		// add JLabel
		panel.add(createJLabel(title));
		return panel;
	}

	// create FlowLayout with align
	private FlowLayout createFlowLayout(int algin) {
		FlowLayout layout = new FlowLayout();
		layout.setAlignment(algin);
		return layout;
	}

	// create JLabel with title and icon
	private JLabel createJLabel(String title) {
		JLabel lb = new JLabel(title);
		// get icon for JLabel
		Icon icon = new ImageIcon(getClass().getResource("7826.png"));
		lb.setIcon(icon);
		// set location for text label
		lb.setHorizontalTextPosition(JLabel.CENTER);
		lb.setVerticalTextPosition(JLabel.BOTTOM);
		return lb;
	}

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

left and Leading, right and trailing
Ta có được hình thứ nhất. Các bạn có thể thấy chúng ta vẫn chưa nhận được một lời giải thích cho vấn đề đặt ra vì căn lề theo LEFT hoàn toàn giống với LEADING, RIGHT chẳng khác gì TRAILING. Tuy nhiên đây mới chỉ là bước đầu thôi, bạn hãy thay đổi cách bố trí của JPanel bằng phương thức setComponentOrientation thành RIGHT_TO_LEFT ta sẽ có được như hình thứ hai và câu trả lời được hé lộ.

Ta có thể hiểu là LEFT và RIGHT là cách căn lề đúng theo lề trái, phải một cách tuyệt đối, còn LEADING và TRAILING là cách đặt lề trái, phải một cách tương đối dựa vào cách đặt lề của Container chứa nó. Khi Container chứa nó có cách sắp xếp (Orientation) là LEFT_TO_RIGHT thì LEADING là bên trái, TRAILING là bên phải, còn khi Orientation là RIGHT_TO_LEFT thì LEADING lại là bên phải, TRAILING là bên trái.