Gridbaglayout và gridlayout 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ú ý: Kích thước các đối tượng trên Layout này sẽ được kéo dãn cho cân bằng với kích thước container chứa nó. Ví dụ: panel có chiều dài 100, rộng 100. setLayout là GridLayout(2,2). Có 3 đối tượng dược add vào panel. Khi đó nó sẽ tự thiết lập kích thước của mỗi đối tượng là: dài 50 (50*2=100=chiều rộng của panel), rộng 50(50*2=chiều dài của panel) (không có biên giữa 2 hàng).Nhận thấy, trong ví dụ trên nhận thấy dù đối tượng thứ 3 đứng lẽ loi một mình một hàng (hàng 2, cột 1) nhưng vẫn có chiều rộng là 50 (chứ không phải là 100). Và dù cho bạn có một button có tiêu đề là "OK" (2 ký tự) thì nó vẫn được dãn ra cho bằng kích thước 50. Ta thấy sự trái ngược hoàn toàn giữa GridLayout và Flow+BorderLayout.

Như các bạn đã biết các Container (như JFrame, JPanel, …) dùng để chứa các control trong nó, tuy nhiên chúng lại không có hoặc có mặc định cách sắp xếp các đối tượng không như ý muốn của ta. Vì vậy chúng ta cần sử dụng các Layout để thực hiện việc này. Nói cách khác các Layout giúp chúng ta có thể sắp xếp các control trong các Container một cách hợp lý và đẹp mắt.

Nội dung
Tạo sử dụng GridLayout

GridLayout là một Layout đơn giản và dễ sử dụng, nó chia Container của chúng ta thành dạng bảng gồm các hàng và các cột có kích thước bằng nhau.
Chúng ta sử dụng GridLayout khi mà cách bố trí của chúng ta giống một bảng, ví dụ như cách bố trí các JButton trong chiếc máy tính như thế này.

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

Ví dụ sử dụng GridLayout

Ở ví dụng này chúng ta sẽ tạo 1 bảng gồm 4 Jbutton đặt trong một JPanel dùng GridLayout. Khi click vào mỗi JButton thì có thể thay đổi khoảng cách ngang, dọc giữa chúng. Bên dưới có 2 JLabel hiển thị khoảng cách ngang (hGap), dọc (vGap) giữa chúng.

package nguyenvanquan7826.GridLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class MyGridLayout extends JFrame implements ActionListener { private JPanel mainPanel; private GridLayout gridLayout; private JLabel lbHGap; private JLabel lbVGap; final int dram = 3; public MyGridLayout() { createJFrame(); } private void createJFrame() { // create JFrame setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 400); // add content to JFrame mainPanel = createMainPanel(); add(mainPanel); // display setLocationRelativeTo(null); setVisible(true); } private JPanel createMainPanel() { // create JPanel with GridLayout gridLayout = new GridLayout(3, 2, 5, 5); JPanel panel = new JPanel(gridLayout); // add four JButton to panel panel.add(createJButton("+ vGap")); panel.add(createJButton("- vGap")); panel.add(createJButton("+ hGap")); panel.add(createJButton("- hGap")); // create and add vGap and hGap JLabel to panel lbVGap = createJLabel("vGap = 5"); lbHGap = createJLabel("hGap = 5"); panel.add(lbVGap); panel.add(lbHGap); return panel; } // create JButton private JButton createJButton(String buttonName) { JButton btn = new JButton(buttonName); btn.addActionListener(this); return btn; } // create JLabel private JLabel createJLabel(String title) { JLabel lb = new JLabel(title); lb.setHorizontalAlignment(JLabel.CENTER); return lb; } // change vGap and hGap private void changeGap(int vGap, int hGap) { if (vGap >= 0 && hGap >= 0) { gridLayout.setVgap(vGap); gridLayout.setHgap(hGap); lbVGap.setText("vGap = " + vGap); lbHGap.setText("hGap = " + hGap); gridLayout.layoutContainer(mainPanel); } } @Override public void actionPerformed(ActionEvent evt) { String command = evt.getActionCommand(); if (command == "+ vGap") { // augment vGap changeGap(gridLayout.getVgap() + dram, gridLayout.getHgap()); } if (command == "- vGap") {// abatement vGap changeGap(gridLayout.getVgap() - dram, gridLayout.getHgap()); } if (command == "+ hGap") {// augment hGap changeGap(gridLayout.getVgap(), gridLayout.getHgap() + dram); } if (command == "- hGap") {// abatement hGap changeGap(gridLayout.getVgap(), gridLayout.getHgap() - dram); } } public static void main(String[] args) { new MyGridLayout(); } }

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

Các phương thức khởi tạo GridLayout
– GridLayout(): Tạo Gridlayout với 1 hàng, 1 cột
– GridLayout(int rows, int cols): Tạo GridLayou với số hàng và số cột được chỉ định
– GridLayout(int rows, int cols, int hgap, int vgap): Tạo GridLayout với số hàng, số cột, khoảng cách giữa các hàng và các cột.

Trong đoạn code này bạn chú ý lệnh gridLayout.layoutContainer(mainPanel);, lệnh này cho phép Container (trong này là mainPanel) sử dụng Layout đó (ở đây là gridLayout).