GridLayout 的问题是所有网格框的大小必须完全相同,如果这是您想要的布局,例如当您想要创建棋盘时,这很好,但如果您需要,这不是很好更灵活的网格。我自己,我会使用不同的布局,例如 GridBagLayout,它可以为您的定位和间隙提供更大的灵活性。例如:
import java.awt.*;
import javax.swing.*;
public class Foo001 {
public static void main(String[] args) {
JPanel panel2 = new JPanel (new GridBagLayout());
GridBagConstraints gbc = createGbc(0, 0);
panel2.add(new JLabel("Jinete"), createGbc(0, 0));
panel2.add(new JTextField(15), createGbc(1, 0));
panel2.add(new JLabel("Caballo"), createGbc(0, 1));
panel2.add(new JTextField(15), createGbc(1, 1));
panel2.setBorder(BorderFactory.createTitledBorder("Info Jinete y Caballo"));
// Show the JPanel for demonstration purposes
JOptionPane.showMessageDialog(null, panel2);
}
private static GridBagConstraints createGbc(int x, int y) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = x;
gbc.gridy = y;
gbc.fill = GridBagConstraints.HORIZONTAL;
int gap = 3;
gbc.insets = new Insets(gap, gap + 2 * gap * x, gap, gap);
return gbc;
}
}
这段代码的关键,以及使用 GridBagLayout 的难点,是正确设置 GridBagConstraints,这是我经常使用实用方法做的事情,这里是 createGbc(...)。 gridx 和 gridy 设置很明显,因为这是组件相对于彼此放置的位置。插图是组件周围的间隙,我给了 JTextFields 一个更大的左侧插图,以便将它们与各自的 JLabels 分开一点:`
new Insets(gap, gap + 2 * gap * x, gap, gap);
左边的pad,gap + 2 * gap * x是gap大小(这里是3),当x为0时(在第一列),gapx 3,当x为1时。