Gridbaglayout và grid layout khác nhau như thế nào

Cách trình bày GridBag Layout cũng trình bày các đối tượng tương tự như Grid Layout: Các đối tượng sẽđược định vị theo vị trí các ô (cell) của một khung lưới (grid). Tuy nhiên, GridBag cho phép ta định kích thước của đối tượng sẽ chiếm bao nhiêu ô và sẽ được đặt ở vị trí nào trong khung lưới. Các phương thức cơ bản:

• GridBagLayout(): Khởi tạo một đối tượng trình bày theo cách gridbag.

• setConstraints(Component, GridBagConstraints): Đặt vị trí và kích thước của đối tượng component theo các ràng buộc trong gridbagConstraints.

GridBagConstraints

Đây là lớp chứa các ràng buộc cho các đối tượng được trình bày theo cách GridBag. Các phương thức và thuộc tính cơ bản của lớp GridBagConstraints:

• GridBagConstraints(): Khởi tạo một đối tượng ràng buộc của GridBag.

• gridx/gridy: Vị trí của cell mà ta muốn đặt đối tượng vào (theo chiều X và chiều Y).

• gridwidth/gridheight: Kích thước (vùng trình bày) của đối tượng (Theo chiều rộng và chiều cao).

• fill: Xác định cách đặt đối tượng, theo 4 cách:

- GridBagConstraints.NONE: Đối tượng không thay đổi kích thước theo các cell nó chiếm.

- GridBagConstraints.VERTICAL: Đối tượng có chiều cao kín vùng nó chiếm - GridBagConstraints.HORIZONAL: Đối tượng có chiều rộng kín vùng nó chiếm - GridBagConstraints.BOTH: Đối tượng có chiều cao và chiều rộng phủ kín vùng

nó chiếm.

• ipadx/ipady: Định đơn vị tăng giảm kích thước của đối tượng khi khung chứa bị thay đổi kích thước (theo chiều X và chiều Y).

• insets: Xác định khoảng cách giữa các cell theo bốn hướng: Trên, dưới, trái, phải.

• anchor: Xác định vị trí neo đối tượng khi kích thước khung chứa thay đổi. Bao gồm: NORTH, NORTHEAST, NORTHWEST, EAST, SOUTH, SOUTHEAST, SOUTHWEST.

• weightx/weighty: Định khoảng cách lớn ra tương đối giữa các đối tượng với nhau. Chương trình 6.15 minh hoạ cách trình bày gridbag: Tạo ra ba nút nhấn trong frame, mỗi nút có một số ràng buộc khác nhau về kích thước và vị trí.

Chương trình 6.15

package vidu.chuong6; import java.awt.*;

public class GridBagLayoutDemo{

// Khai báo và khởi tạo frame có tiêu đề

Frame myFrame = new Frame(“Frame has somes buttons!”);

myFrame.setSize(300,150); // Định kích cỡ frame

GridBagLayout layout = new GridBagLayout();

myFrame.setLayout(layout); // Định cách trình bày

// Khai báo đối tượng ràng buộc

GridBagConstraints cts = new GridBagConstraints(); cts.fill = GridBagConstraints.BOTH;

// Button1: vị trí (1,1), kích thước (1,1) Button btn1 = new Button(“Click1”);

cts.gridx = 1; cts.gridy = 1; cts.gridheight = 1; cts.gridwidth = 1;

layout.setConstraints(btn1, cts); // Định ràng buộc

myFrame.add(btn1); // Gắn vào frame

// Button2: vị trí (2,2), kích thước (1,1) Button btn2 = new Button(“Click2”);

cts.gridx = 2; cts.gridy = 2; cts.gridheight = 1; cts.gridwidth = 1;

layout.setConstraints(btn2, cts); // Định ràng buộc

myFrame.add(btn2); // Gắn vào frame

// Button3: vị trí (3,3), kích thước (1,1) Button btn3 = new Button(“Click3”);

cts.gridx = 3; cts.gridy = 3; cts.gridheight = 1; cts.gridwidth = 1;

layout.setConstraints(btn3, cts); // Định ràng buộc

myFrame.add(btn3); // Gắn vào frame

myFrame.setVisible(true); // Hiển thị frame

} }

Hình 6.14: Kết quả demo Gridbag layout

Look at JNodeLayout. RectNode is exactly what you Need.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.geom.Rectangle2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;

import com.smartg.swing.layout.JNodeLayout;
import com.smartg.swing.layout.LayoutNode.RectNode;

public class RectNodeDemo {

    public static void main(String[] args) {

        String rootName = "root";
        RectNode root = new RectNode(rootName);
        JNodeLayout layout = new JNodeLayout(root);
        layout.setHgap(1);
        layout.setVgap(1);


        JPanel target = new JPanel();
        target.setBorder(new EmptyBorder(10, 10, 10, 10));

        target.setLayout(layout);

        addPanel(target, root, new Rectangle2D.Double(0, 0, .5, .5));
        addPanel(target, root, new Rectangle2D.Double(0, .5, .5, .1));
        addPanel(target, root, new Rectangle2D.Double(0, .6, .5, .4));  

        addPanel(target, root, new Rectangle2D.Double(.5, 0, .5, .9));
        addPanel(target, root, new Rectangle2D.Double(.5, .9, .5, .1));

        layout.syncNodes();

        JFrame frame = new JFrame();

        Container contentPane = frame.getContentPane();
        contentPane.setLayout(new BorderLayout());
        contentPane.add(target, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }

    static void addPanel(JPanel target, RectNode node, Rectangle2D r) {
        JPanel p = new JPanel();
        target.add(p);
        p.setBorder(new LineBorder(Color.BLACK, 1));
        node.add(p, r);
    }
}