您可以使用JSeparator,或者将每组 3x3 字段分成单独的窗格并使用LineBorder。
只要您正确设置了字段,您就应该能够使复合面板/LineBorder
工作
更新
对不起,应该是MatteBorder
:P
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.gridx = 0;
gbc.gridy = 0;
for (int row = 0; row < 4; row++) {
gbc.gridx = 0;
add(buildGroup(0, 0, 1, 1), gbc);
gbc.gridx++;
add(buildGroup(0, 0, 1, 1), gbc);
gbc.gridx++;
add(buildGroup(0, 0, 1, 1), gbc);
gbc.gridx++;
add(buildGroup(0, 0, 1, 0), gbc);
gbc.gridy++;
}
public JPanel buildGroup(int top, int left, int bottom, int right) {
JPanel panel = new JPanel(new GridBagLayout());
panel.setBorder(new MatteBorder(top, left, bottom, right, Color.RED));
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(2, 2, 2, 2);
gbc.fill = GridBagConstraints.HORIZONTAL;
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 3; col++) {
JTextField field = new JTextField(8);
gbc.gridx = col;
gbc.gridy = row;
panel.add(field, gbc);
}
}
return panel;
}
现在,显然,您需要弄清楚如何为您的字段播种,但基本上,我只需传入您想要使用的字段(例如 2D 数组)。
或使用分隔符:P
for (int row = 0; row < 9; row++) {
gbc.gridwidth = 1;
gbc.weightx = 0;
int verSplit = 0;
for (int col = 0; col < 12; col++) {
gbc.gridx++;
add(new JTextField(8), gbc);
verSplit++;
if (verSplit == 3) {
verSplit = 0;
gbc.gridx++;
if (horSplit % 3 == 0) {
gbc.gridheight = 3;
gbc.fill = GridBagConstraints.VERTICAL;
add(new JSeparator(JSeparator.VERTICAL), gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridheight = 1;
}
}
}
horSplit++;
gbc.gridx = 0;
if (horSplit == 3) {
horSplit = 0;
gbc.gridy++;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 1;
add(new JSeparator(JSeparator.HORIZONTAL), gbc);
}
gbc.gridy++;
}
或同一主题的变体
更新了现场管理
// Build the array of fields, I used a col by row matrix
JTextField fields[][] = new JTextField[12][12];
for (int col = 0; col < 12; col++) {
for (int row = 0; row < 12; row++) {
fields[col][row] = new JTextField(col + "x" + row, 8);
}
}
// Build the groups...
for (int row = 0; row < 12; row++) {
gbc.gridx = 0;
int col = 0;
add(buildGroup(fields, col, row, 0, 0, 1, 1), gbc);
col += 3;
gbc.gridx++;
add(buildGroup(fields, col, row, 0, 0, 1, 1), gbc);
col += 3;
gbc.gridx++;
add(buildGroup(fields, col, row, 0, 0, 1, 1), gbc);
col += 3;
gbc.gridx++;
add(buildGroup(fields, col, row, 0, 0, 1, 0), gbc);
gbc.gridy++;
row += 2; // This is important, don't miss this ;)
}
public JPanel buildGroup(JTextField[][] fields, int startCol, int startRow, int top, int left, int bottom, int right) {
JPanel panel = new JPanel(new GridBagLayout());
panel.setBorder(new MatteBorder(top, left, bottom, right, Color.RED));
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(2, 2, 2, 2);
gbc.fill = GridBagConstraints.HORIZONTAL;
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 3; col++) {
// Get the field to use for this cell
JTextField field = fields[col + startCol][row + startRow];
gbc.gridx = col;
gbc.gridy = row;
panel.add(field, gbc);
}
}
return panel;
}