2012-08-13 25 views
0

我開發了一個使用GridBagLayout來排列12X12文本字段的框架。即幀上總共144個文本字段。現在我想要在每個3列和3行之後用彩色線區分這些文本字段,如下圖所示。我嘗試了很多方法,但我找不到解決方案。請建議。以下是我的代碼的一部分。提前致謝。如何獲得彩色線條以區分文本字段數組

1 2 3 | 4 5 6 | 7 8 9 | 10 11 12 
     |  |  | 
1 2 3 | 4 5 6 | 7 8 9 | 10 11 12 
     |  |  | 
1 2 3 | 4 5 6 | 7 8 9 | 10 11 12 
-------------------------------  
1 2 3 | 4 5 6 | 7 8 9 | 10 11 12 
     |  |  | 
1 2 3 | 4 5 6 | 7 8 9 | 10 11 12 
     |  |  | 
1 2 3 | 4 5 6 | 7 8 9 | 10 11 12 
-------------------------------- | 
1 2 3 | 4 5 6................ 
. . 
. . 
. 

請在圖表中考慮每個數字作爲一個文本字段。

JTextField jt[][]=new JTextField[12][12]; 


for(int i=0;i<jt.length;i++) 
     { 
      for(int j=0;j<jt.length;j++) 
      { 

       jt[i][j] = new JTextField(1); 


       constraints.gridx=j; 
       consraints.gridy=i; 
       gridbag.setConstraints(jt[i][j],cons); 
       c.add(jt[i][j]); 
           jt[i][j].setHorizontalAlignment(JTextField.CENTER); 
       jt[i][j].setFont(new Font("TimesNewRoman",Font.BOLD,14)); 
       jt[i][j].setDocument(new JTextFieldLimit(2)); 
      } 
     } 

回答

4

你能我們一個JSeparator,或者每一組3×3場打入有自己單獨的窗格和使用LineBorder

只要你已經設置你的字段正確,你應該能夠得到複合面板/ LineBorder工作

UPDATE

對不起,它應該是MatteBorder:P

現在

Matte Border

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

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; 

} 
+0

對不起變化,我沒有得到你對線邊界的回答。我使用JSeparator,但它不起作用。 – Spike 2012-08-13 09:00:08

+0

@AnoopKumar @AnoopKumar很好,基本上這個想法是,而不是把所有的領域放在一個單一的面板上,你將它們平均分配到不同的面板上,並在每個面板上使用LineBorder ...試圖讓寶寶入睡,稍後更新 – MadProgrammer 2012-08-13 09:04:56

+0

謝謝非常感謝您的回覆。我用MatteBorder,但問題是我不應該改變文本字段的名稱。在這裏,您已爲所有文本字段提供了通用名稱。但在我的代碼中,我將每個領域與某個關係聯繫在一起。我使用jt [0] [0],jt [0] [1] ....來代替對144字段使用單獨的名稱,就像使用循環一樣。 – Spike 2012-08-13 11:08:03