GridBagLayout是一个灵活的布局管理器,开发者可以根据设置动态单元网格的大小和比例来实现布局管理。每一个GridBagLayout管理的组件都和一个GridBagConstaints容器有关,该容器中限制了组件位置,大小等变化。
GridBagConstaints中常用字段介绍
- gridx、gridy:网格起始位置,第一个组件的位置是gridx = 0,gridy =0;下一个组件的位置默认为GridBagConstaints.
RELATIVE。
- gridwidth、gridheight:制定网格所占的行和列的个数,默认为占用1行或1列。有
REMAINDER
代表该组件占用这一行或这一列 - wightx、wighty:组件在一行或一列中占有的权重是多少。当容器大于组件的容量或者小于组件的容量时,组件进行缩放的比例。
- fill:组件扩容或缩放打方向,NONE(默认值),HORIZONTAL(水平方向),VERTICAL(垂直方向),BOTH。
- ipadx、ipady:布局组件的内部填充,相当与网页中的内边距(padding)。
- insets:组件的外部填充。
- anchor:组件位于显示区域何处。
GridBagLayout布局举例
布局介绍:
第一部分:将文本域插入到Panel中,并将面板设置GridBagConstraints属性。
其中gridx = 0,gridy = 0 表示Panel从左上角插入,gridheight = 1,gridwidth = 1 表示占用一个网格。weightx = 1.0,weighty = 0.2表示当容器扩大缩小是,水平方向比例是1.0,垂直方向是0.2;
private JPanel getPanelByHead(GridBagLayout gridBagLayout, GridBagConstraints c) {
c.gridx = 0;
c.gridy = 0;
c.gridheight = 1;
c.gridwidth = 1;
c.weightx = 1.0;
c.weighty = 0.2;
JPanel jPanel = new JPanel();
jPanel.setLayout(new GridLayout(1, 1));
JTextArea jTextArea = new JTextArea();
jTextArea.setForeground(Color.decode("#FFFFCC"));
jTextArea.setBackground(Color.decode("#666666"));
jTextArea.setFont(new Font(Font.DIALOG, Font.BOLD, 16));
jPanel.add(jTextArea);
gridBagLayout.setConstraints(jPanel, c);
return jPanel;
}
第二部分:将20个按钮插入到Panel中,并将面板设置GridBagConstraints属性。
其中gridx = 0,gridy = 1表示上一个组件后插入,gridheight = 1,gridwidth = 1 表示占用一个网格。weightx = 1.0,weighty = 0.8表示当容器扩大缩小是,水平方向比例是1.0,垂直方向是0.8;
// 将按钮添加到面板中
private JPanel getPanelByBody(GridBagLayout gridBagLayout, GridBagConstraints c) {
c.gridx = 0;
c.gridy = 1;
c.gridheight = 1;
c.gridwidth = 1;
c.weightx = 1.0;
c.weighty = 0.8;
JPanel jPanel = new JPanel();
jPanel.setLayout(new GridLayout(5, 4));
List<JButton> numBut = getButtonByNumber();
for (int i = 0; i < numBut.size(); i++) {
jPanel.add(numBut.get(i));
}
gridBagLayout.setConstraints(jPanel, c);
return jPanel;
}
下面是完整代码代码:
package com.qyy;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
public class Main extends JFrame {
private int WIDTH = 618 * 2 / 3;
private int HEIGHT = 1000 * 2 / 3;
public Main() {
this.setSize(WIDTH, HEIGHT);
this.setTitle("GridBagLayout测试");
init();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
// 数字按钮
private List<JButton> getButtonByNumber() {
List<JButton> list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
JButton jButton = new JButton(i + " ");
jButton.setFont(new Font(Font.DIALOG, 1, 20));
jButton.setBackground(Color.decode("#99CCCC"));
list.add(jButton);
}
return list;
}
// 将文本域添加到面板中
private JPanel getPanelByHead(GridBagLayout gridBagLayout, GridBagConstraints c) {
c.gridx = 0;
c.gridy = 0;
c.gridheight = 1;
c.gridwidth = 1;
c.weightx = 1.0;
c.weighty = 0.2;
JPanel jPanel = new JPanel();
jPanel.setLayout(new GridLayout(1, 1));
JTextArea jTextArea = new JTextArea();
jTextArea.setForeground(Color.decode("#FFFFCC"));
jTextArea.setBackground(Color.decode("#666666"));
jTextArea.setFont(new Font(Font.DIALOG, Font.BOLD, 16));
jPanel.add(jTextArea);
gridBagLayout.setConstraints(jPanel, c);
return jPanel;
}
// 将按钮添加到面板中
private JPanel getPanelByBody(GridBagLayout gridBagLayout, GridBagConstraints c) {
c.gridx = 0;
c.gridy = 1;
c.gridheight = 1;
c.gridwidth = 1;
c.weightx = 1.0;
c.weighty = 0.8;
JPanel jPanel = new JPanel();
jPanel.setLayout(new GridLayout(5, 4));
List<JButton> numBut = getButtonByNumber();
for (int i = 0; i < numBut.size(); i++) {
jPanel.add(numBut.get(i));
}
gridBagLayout.setConstraints(jPanel, c);
return jPanel;
}
// 初始化
public void init() {
GridBagLayout gridBagLayout = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
this.setLayout(gridBagLayout);
this.add(getPanelByHead(gridBagLayout, c));
this.add(getPanelByBody(gridBagLayout, c));
}
public static void main(String[] args) {
new Main();
}
}