你能我們一個JSeparator,或者每一組3×3場打入有自己單獨的窗格和使用LineBorder。
只要你已經設置你的字段正確,你應該能夠得到複合面板/ LineBorder
工作
UPDATE
對不起,它應該是MatteBorder
:P
現在
![Matte Border](https://i.stack.imgur.com/jryLT.png)
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;
}
,obvi最重要的是,你需要弄清楚你將如何種子你的領域,但基本上,我只是通過你想要使用的領域(例如二維數組)。
或用分隔符:P
![Separators](https://i.stack.imgur.com/wsqOx.png)
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;
}
對不起變化,我沒有得到你對線邊界的回答。我使用JSeparator,但它不起作用。 – Spike 2012-08-13 09:00:08
@AnoopKumar @AnoopKumar很好,基本上這個想法是,而不是把所有的領域放在一個單一的面板上,你將它們平均分配到不同的面板上,並在每個面板上使用LineBorder ...試圖讓寶寶入睡,稍後更新 – MadProgrammer 2012-08-13 09:04:56
謝謝非常感謝您的回覆。我用MatteBorder,但問題是我不應該改變文本字段的名稱。在這裏,您已爲所有文本字段提供了通用名稱。但在我的代碼中,我將每個領域與某個關係聯繫在一起。我使用jt [0] [0],jt [0] [1] ....來代替對144字段使用單獨的名稱,就像使用循環一樣。 – Spike 2012-08-13 11:08:03