[JavaSwing] GridLayout
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.
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(); } }
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).
Tham khảo thêm: class GridLayout, use GridLayout
a ơi cho e hỏi cách làm cái phần bảng tính của cái máy tính a để ở đầu bài viết với ak
Dùng kết hợp các loại layout là được nhé, có thể chỉ cần dùng GridLayout sẽ dễ hơn.
e cảm ơn a nhiều lắm, những bài học trên web của anh đã giúp đỡ e rất nhiều trong quá trình học tập. E có 1 yêu cầu nhỏ là a có thể làm thêm về phần LayoutManager với các loại như CardLayout, GroupLayout và SpringLayout được không? Bởi vì a viết rất dễ hiểu. Vậy e cảm ơn a nhé!!!
Cảm ơn em nhé. Anh sẽ cố gắng nhưng dạo này hơi bận với lâu không động vào java.
Anh ơi, em muốn hỏi lớp gridLayout nó có hỗ trợ gộp 2 ô lại đc ko, nghĩ là 2 ô trong bảng chỉ hiển thị 1 JButton chẳng hạn?
Cái này thử dùng GridBagLayout nhé
Anh ơi cho em hỏi làm sao để xóa 1 gridlayout để tạo 1 gridlayout mới vậy a?
VD: ban đầu em tạo Pplay.setLayout(new GridLayout(5, 5));
nhưng sau đó muốn xóa cái trước và tạo lại 1 Pplay.setLayout(new GridLayout(7, 7));
bạn cứ set cái mới là nó tự khắc mới. 🙂
cho e hỏi layoutContainer làm gì vậy vì bỏ nó vẫn chạy bình thường mà