GridBagLayout in Java
Vấn đề thường hay gặp phải khi lần đầu tìm hiểu ngôn ngữ Java là làm sao để sắp xếp các component trên form theo đúng ý của mình. Có rất nhiều câu hỏi xoay quanh vấn đề này, mặc dù Java đã hỗ trợ khá nhiều layout giúp một lập trình viên có thể dễ dàng bố cục các component theo đúng ý của mình. Bài viết này không có ý định tìm hiểu chi tiết từng loại layout đã được hỗ trợ trong Java, mà chỉ tập trung vào xem xét GridBagLayout, việc sử dụng nó như thế nào cho hiệu quả. Bài viết cũng cung cấp nhiều ví dụ nhằm giúp cho người mới làm quen với Java có cái nhìn rõ hơn về GridBagLayout.
GridBagLayout là một lớp bố cục khá hữu dụng, nếu được sử dụng một cách hiệu quả thì nó sẽ là sự thay thế hoàn hảo cho công việc của FlowLayout, GridLayout và BorderLayout. GridBagLayout chia một container thành một mảng của các ô (cell), nhưng không giống như các ô trong GridLayout, mỗi ô trong GrigBagLayout có thể có chiều cao và chiều rộng khác nhau. Một component có thể chiếm giữ một phần hoặc toàn bộ không gian của một ô, hoặc nó có thể chiếm giữ nhiều ô cùng một lúc. Để đặt một component đúng vị trí GridBagLayout cần rất nhiều thông tin, những thông tin này nằm trong lớp GridBagConstrains như gridx, gridy, gridwidth, gridheight, anchor, fill … Khi đưa một component vào container bạn sử dụng phương thức add(Component, Object), ở đây Object chính là đối tượng GridBagConstrains.
Để sử dụng GridBagLayout, có 3 vấn đề bạn cần xem xét:
- Kích thước của các ô (cell) khác nhau, chúng co giãn như thế nào khi kích thước của container thay đổi
- Vị trí để đặt component phải được xác định rõ ràng
- Component được đặt như thế nào trong vùng không gian mà nó chiếm giữ
1. gridx và gridy: Vị trí ô trên khung lưới của đối tượng mà ta đưa vào: ví dụ gridx=1, gridy=2 tức là đặt đối tượng tại ô cột 1, hàng 2
2. gridwidth, gridheight: kích thước của đối tượng đưa vào, tức là đối tượng chứa mấy ô theo chiều ngang (width) và chiều dọc (height)
3. fill: giả sử một đối tượng đưa vào không khít hết các ô nó chiếm thì có thể dùng cái này.
• Giá trị GridBagConstrains.NONE tức là giữ nguyên không đổi kích thước đối tượng.
• Giá trị GridBagConstrains.VERTICAL giãn chiều cao của đối tượng cho khít
• Giá trị GridBagConstrains.HORIZONTAL giãn chiều ngang của đối tượng cho khít
• Giá trị GridBagConstrains.BOTH giãn cả 2 chiều của đối tượng cho khít
4. ipadx, ipady: tăng kích thước hai bên trái phải (hoặc trên dưới) đối tượng thêm ipadx (ipady) pixel khi kích thước khung chứa thay đổi
5. insets: đối tượng thuộc lớp Insets chỉ ra khoảng cách tứ phía so với đối tượng khác. Ví dụ bạn thêm: constraint.insets = new Insets(5,5,5,5) thì các đối tượng sẽ cách nhau 5 pixel các chiều
6. anchor: neo đối tượng theo vị trí nào đấy so với ô đặt nó. Có các giá trị (tự hiểu ý nghĩa): NORTH, NORTHEAST, NORTHWEST, WEST, EAST, SOUTH, SOUTHEAST, SOUTHWEST.
7. weightx, weighty: khoảng cách lớn ra tương đối giữa các đối tượng
Chúng ta cùng xem xét các vấn đề này qua các vị dụ:
Hai thuộc tính weightx, weighty được hiểu nôm na như thế này: đó là khoảng không gian thêm vào một ô khi container thay đổi kích thước. Bạn thử thay đổi kích thước container để xem sự thay đổi.
Các ví dụ tiếp theo sẽ bàn về vấn đề: vị trí của component và sự co giãn của nó trong ô mà nó chiếm giữ. Hãy xem xét ví dụ sau:
....
GridBagLayout là một lớp bố cục khá hữu dụng, nếu được sử dụng một cách hiệu quả thì nó sẽ là sự thay thế hoàn hảo cho công việc của FlowLayout, GridLayout và BorderLayout. GridBagLayout chia một container thành một mảng của các ô (cell), nhưng không giống như các ô trong GridLayout, mỗi ô trong GrigBagLayout có thể có chiều cao và chiều rộng khác nhau. Một component có thể chiếm giữ một phần hoặc toàn bộ không gian của một ô, hoặc nó có thể chiếm giữ nhiều ô cùng một lúc. Để đặt một component đúng vị trí GridBagLayout cần rất nhiều thông tin, những thông tin này nằm trong lớp GridBagConstrains như gridx, gridy, gridwidth, gridheight, anchor, fill … Khi đưa một component vào container bạn sử dụng phương thức add(Component, Object), ở đây Object chính là đối tượng GridBagConstrains.
Để sử dụng GridBagLayout, có 3 vấn đề bạn cần xem xét:
- Kích thước của các ô (cell) khác nhau, chúng co giãn như thế nào khi kích thước của container thay đổi
- Vị trí để đặt component phải được xác định rõ ràng
- Component được đặt như thế nào trong vùng không gian mà nó chiếm giữ
1. gridx và gridy: Vị trí ô trên khung lưới của đối tượng mà ta đưa vào: ví dụ gridx=1, gridy=2 tức là đặt đối tượng tại ô cột 1, hàng 2
2. gridwidth, gridheight: kích thước của đối tượng đưa vào, tức là đối tượng chứa mấy ô theo chiều ngang (width) và chiều dọc (height)
3. fill: giả sử một đối tượng đưa vào không khít hết các ô nó chiếm thì có thể dùng cái này.
• Giá trị GridBagConstrains.NONE tức là giữ nguyên không đổi kích thước đối tượng.
• Giá trị GridBagConstrains.VERTICAL giãn chiều cao của đối tượng cho khít
• Giá trị GridBagConstrains.HORIZONTAL giãn chiều ngang của đối tượng cho khít
• Giá trị GridBagConstrains.BOTH giãn cả 2 chiều của đối tượng cho khít
4. ipadx, ipady: tăng kích thước hai bên trái phải (hoặc trên dưới) đối tượng thêm ipadx (ipady) pixel khi kích thước khung chứa thay đổi
5. insets: đối tượng thuộc lớp Insets chỉ ra khoảng cách tứ phía so với đối tượng khác. Ví dụ bạn thêm: constraint.insets = new Insets(5,5,5,5) thì các đối tượng sẽ cách nhau 5 pixel các chiều
6. anchor: neo đối tượng theo vị trí nào đấy so với ô đặt nó. Có các giá trị (tự hiểu ý nghĩa): NORTH, NORTHEAST, NORTHWEST, WEST, EAST, SOUTH, SOUTHEAST, SOUTHWEST.
7. weightx, weighty: khoảng cách lớn ra tương đối giữa các đối tượng
Chúng ta cùng xem xét các vấn đề này qua các vị dụ:
package MyGridBagLayOut; import java.awt.*; import javax.swing.*; public class MyGridBagLayout extends JFrame { /** * */ private static final long serialVersionUID = 1L; private JPanel panel1; private JPanel panel2; private GridBagLayout gbl; private GridBagConstraints c; private Container container; public MyGridBagLayout() { super("ViDu1 v1.0"); setDefaultCloseOperation(EXIT_ON_CLOSE); panel1 = new JPanel(); panel1.setLayout(new GridLayout(3, 1)); panel1.add(new JButton("Nut 1")); panel1.add(new JButton("Nut 2")); panel1.add(new JButton("Nut 3")); panel2 = new JPanel(); panel2.setLayout(new GridLayout(3, 1)); panel2.add(new JButton("Toi")); panel2.add(new JButton("Yeu")); panel2.add(new JButton("Java")); gbl = new GridBagLayout(); container = this.getContentPane(); container.setLayout(gbl); // Hang thu 1 c = new GridBagConstraints(); c.gridx = 0; c.gridy = 0; container.add(new JButton("Dinh-Trai"), c); c.gridx = 1; container.add(new JButton("Dinh-Giua"), c); c.gridx = 2; container.add(new JButton("Dinh-Phai"), c); // Hang thu 2 c.gridx = 0; c.gridy = 1; container.add(new JButton("Trai-Giua.............."), c); c.gridx = 1; container.add(panel1, c); // Hang thu 3 c.gridy = 2; container.add(new JButton("Day-Giua........."), c); c.gridx = 2; container.add(panel2, c); pack(); setVisible(true); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub new MyGridBagLayout(); } }
Kết Quả:![]()
Ở ví dụ trên container của chúng ta có 3 dòng và 3 cột. Vị trí đặt các component được xác định bởi thuộc tính gridx, gridy. Chiều cao của một dòng là chiều cao của component có chiều cao lớn nhất. Chiều rộng của một cột là chiều rông của component có chiều rộng lớn nhất. Như các bạn thấy các component đều tập trung vào giữa container, có rất nhiều khoảng trống dư thừa bao quanh các component. Để giải quyết vấn đề này chúng ta sử dụng hai thuộc tính khác của lớp GridBagConstraints, đó là weightx và weighty. Chúng ta thay đổi một chút trong chương trình trên.
Code:
c = new GridBagConstraints();
// Hang thu 1
c.gridx = 0;
c.gridy = 0;
container.add(new JButton("Dinh-Trai"), c);
c.gridx = 1;
container.add(new JButton("Dinh-Giua"), c);
c.gridx = 2;
c.weightx = 1.0;
container.add(new JButton("Dinh-Phai"), c);
c.weightx = 0.0;
// Hang thu 2
c.gridx = 0;
c.gridy = 1;
container.add(new JButton("Trai-Giua.............."), c);
c.gridx = 1;
container.add(panel1, c);
// Hang thu 3
c.gridy = 2;
container.add(new JButton("Day-Giua........."), c);
c.gridx = 2;
c.weighty = 1.0;
container.add(panel2, c);
c.weighty = 0.0;
Hai thuộc tính weightx, weighty được hiểu nôm na như thế này: đó là khoảng không gian thêm vào một ô khi container thay đổi kích thước. Bạn thử thay đổi kích thước container để xem sự thay đổi.
Các ví dụ tiếp theo sẽ bàn về vấn đề: vị trí của component và sự co giãn của nó trong ô mà nó chiếm giữ. Hãy xem xét ví dụ sau:
....
I'm assuming you mean to ask how to import your existing android
Trả lờiXóaproject into Eclipse.
If that is your question then there are two ways to do it.
(1) File->Import->General->Existing Project into Workspace
(2) File->New->Android Project->Create Project From Existing Source.