2014-10-20 32 views
1

我正在嘗試使用gridx和gridy約束來創建如下所示的界面(忽略Next按鈕)。前兩個JLabel-JTextField對工作正常,但我不確定我爲其餘10個字段設置了什麼gridx和gridy值。瞭解GridBagConstraints gridx和gridy

enter image description here

代碼:

import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class InitialPanel extends JPanel { 

    private static final long serialVersionUID = -3159520372145273536L; 

    /** 
    * @param gridBagLayout 
    */ 
    public InitialPanel() { 

     super(); 

     initComponents(); 
    } 

    /** 
    * For each component to be added to this container: 
    * 
    * 1. Create the component 
    * 2. Set instance variables in the GridBagConstraints instance 
    * 3. Add component to panel. 
    * 
    */ 
    private void initComponents() { 

     this.setLayout(new GridBagLayout()); 

     GridBagConstraints gridBagConstraints = new GridBagConstraints(); 

     // All mandatory fields. 

     // 1. 

     gridBagConstraints.gridx = 0; 

     gridBagConstraints.gridy = 0; 

     JLabel hwCodeLabel = new JLabel("HW CODE:"); 

     this.add(hwCodeLabel, gridBagConstraints); 


     JTextField hwCodeTextField = new JTextField(""); 

     gridBagConstraints.gridx = 1; 

     gridBagConstraints.gridy = 0; 

     hwCodeTextField.setColumns(10); 

     this.add(hwCodeTextField, gridBagConstraints); 


     // 2. 

     JLabel publisherIdLabel = new JLabel("PUBLISHER ID:"); 

     gridBagConstraints.gridx = 0; 

     gridBagConstraints.gridy = 1; 

     this.add(publisherIdLabel, gridBagConstraints); 



     JTextField publisherIdTextField = new JTextField(""); 

     gridBagConstraints.gridx = 1; 

     gridBagConstraints.gridy = 1; 

     publisherIdTextField.setColumns(10); 

     this.add(publisherIdTextField,gridBagConstraints); 



     /*// 3. 
     JLabel journalTitleLabel = new JLabel("JOURNAL TITLE:"); 

     gridBagConstraints.gridx = 0; 

     gridBagConstraints.gridy = 2; 

     this.add(journalTitleLabel,gridBagConstraints); 




     JTextField journalTitleTextField = new JTextField(); 

     gridBagConstraints.gridx = 2; 

     gridBagConstraints.gridy = 2; 

     journalTitleTextField.setColumns(10); 

     this.add(journalTitleTextField,gridBagConstraints); 


     // 4. 


     JLabel printISSNLabel = new JLabel("PRINT ISSN:"); 

     gridBagConstraints.gridx = 3; 

     gridBagConstraints.gridy = 1; 

     this.add(printISSNLabel,gridBagConstraints); 



     JTextField printISSNTextField = new JTextField(); 

     gridBagConstraints.gridx = 3; 

     gridBagConstraints.gridy = 2; 

     journalTitleTextField.setColumns(10); 

     this.add(printISSNTextField,gridBagConstraints); 


     // 5. 

     JLabel eISSNLabel = new JLabel("ELECTRONIC ISSN:"); 

     gridBagConstraints.gridx = 4; 

     gridBagConstraints.gridy = 1; 

     this.add(eISSNLabel,gridBagConstraints); 


     JTextField eISSNTextField = new JTextField(); 

     gridBagConstraints.gridx = 4; 

     gridBagConstraints.gridy = 2; 

     journalTitleTextField.setColumns(10); 

     this.add(eISSNTextField,gridBagConstraints); 


     // 6. 

     JLabel publisherNameLabel = new JLabel("PUBLISHER NAME:"); 

     gridBagConstraints.gridx = 5; 

     gridBagConstraints.gridy = 1; 

     this.add(publisherNameLabel,gridBagConstraints); 



     JTextField publisherNameTextField = new JTextField(); 

     gridBagConstraints.gridx = 5; 

     gridBagConstraints.gridy = 2; 

     journalTitleTextField.setColumns(10); 

     this.add(publisherNameTextField,gridBagConstraints); 



     // 7. 

     JLabel publisherLOCLabel = new JLabel("PUBLISHER LOCATION:"); 

     gridBagConstraints.gridx = 6; 

     gridBagConstraints.gridy = 1; 

     this.add(publisherLOCLabel,gridBagConstraints); 



     JTextField publisherLOCTextField = new JTextField(); 

     gridBagConstraints.gridx = 6; 

     gridBagConstraints.gridy = 2; 

     journalTitleTextField.setColumns(10); 

     this.add(publisherLOCTextField,gridBagConstraints); 



     // 8. 

     JLabel coverDateLabel = new JLabel("COVER DATE:"); 

     gridBagConstraints.gridx = 7; 

     gridBagConstraints.gridy = 1; 

     this.add(coverDateLabel,gridBagConstraints); 


     JTextField coverDateTextField = new JTextField(); 

     gridBagConstraints.gridx = 7; 

     gridBagConstraints.gridy = 2; 

     journalTitleTextField.setColumns(10); 

     this.add(coverDateTextField,gridBagConstraints); 


     // 9. 

     JLabel volumeLabel = new JLabel("VOLUME:"); 

     gridBagConstraints.gridx = 8; 

     gridBagConstraints.gridy = 1; 

     this.add(volumeLabel,gridBagConstraints); 



     JTextField volumeTextField = new JTextField(); 

     gridBagConstraints.gridx = 8; 

     gridBagConstraints.gridy = 2; 

     journalTitleTextField.setColumns(10); 

     this.add(volumeTextField,gridBagConstraints); 


     // 10. 

     JLabel issueLabel = new JLabel("ISSUE:"); 

     gridBagConstraints.gridx = 9; 

     gridBagConstraints.gridy = 1; 

     this.add(issueLabel,gridBagConstraints); 



     JTextField issueTextField = new JTextField(); 

     gridBagConstraints.gridx = 9; 

     gridBagConstraints.gridy = 2; 

     journalTitleTextField.setColumns(10); 

     this.add(issueTextField,gridBagConstraints); 


     // 11. 

     JLabel copyrightStatementLabel = new JLabel("COPYRIGHT STATEMENT:"); 

     gridBagConstraints.gridx = 10; 

     gridBagConstraints.gridy = 1; 

     this.add(copyrightStatementLabel,gridBagConstraints); 



     JTextField copyrightStatementTextField = new JTextField(); 

     gridBagConstraints.gridx = 10; 

     gridBagConstraints.gridy = 2; 

     journalTitleTextField.setColumns(10); 

     this.add(copyrightStatementTextField,gridBagConstraints); 


     // 12. 

     JLabel copyRightYearLabel = new JLabel("COPYRIGHT YEAR:"); 

     gridBagConstraints.gridx = 11; 

     gridBagConstraints.gridy = 1; 

     this.add(copyRightYearLabel,gridBagConstraints); 


     JTextField copyRightYearTextField = new JTextField(); 

     gridBagConstraints.gridx = 11; 

     gridBagConstraints.gridy = 2; 

     journalTitleTextField.setColumns(10); 

     this.add(copyRightYearTextField,gridBagConstraints); 
*/ 
    } 

} 

回答

2

這裏我修改程序,以獲得期望的結果,我還增加了兩種方法來使你的代碼更易讀,高效:

public class InitialPanel extends JPanel { 

    private static final long serialVersionUID = -3159520372145273536L; 

    public InitialPanel() { 
     super(); 
     initComponents(); 
    } 

    private void initComponents() { 

     this.setLayout(new GridBagLayout()); 

     GridBagConstraints gridBagConstraints = new GridBagConstraints(); 

     // All mandatory fields. 
     // 1. 
     JLabel hwCodeLabel = addMyLabelCell(0, "HW CODE:"); 
     JTextField hwCodeTextField = addMyTextFieldCell(0, ""); 

     // 2. 
     JLabel publisherIdLabel = addMyLabelCell(1, "PUBLISHER ID:"); 
     JTextField publisherIdTextField = addMyTextFieldCell(1, ""); 

     // 3. 
     JLabel journalTitleLabel = addMyLabelCell(2, "JOURNAL TITLE:"); 
     JTextField journalTitleTextField = addMyTextFieldCell(2, ""); 

     // 4. 
     JLabel printISSNLabel = addMyLabelCell(3, "PRINT ISSN:"); 
     JTextField printISSNTextField = addMyTextFieldCell(3, ""); 

     // 5. 
     JLabel eISSNLabel = addMyLabelCell(4, "ELECTRONIC ISSN:"); 
     JTextField eISSNTextField = addMyTextFieldCell(4, ""); 

     // 6. 
     JLabel publisherNameLabel = addMyLabelCell(5, "PUBLISHER NAME:"); 
     JTextField publisherNameTextField = addMyTextFieldCell(5, ""); 

     // 7. 
     JLabel publisherLOCLabel = addMyLabelCell(6, "PUBLISHER LOCATION:"); 
     JTextField publisherLOCTextField = addMyTextFieldCell(6, ""); 

     // 8. 
     JLabel coverDateLabel = addMyLabelCell(7, "COVER DATE:"); 
     JTextField coverDateTextField = addMyTextFieldCell(7, ""); 

     // 9. 
     JLabel volumeLabel = addMyLabelCell(8, "VOLUME:"); 
     JTextField volumeTextField = addMyTextFieldCell(8, ""); 

     // 10. 
     JLabel issueLabel = addMyLabelCell(9, "ISSUE:"); 
     JTextField issueTextField = addMyTextFieldCell(9, ""); 

     // 11. 
     JLabel copyrightStatementLabel = addMyLabelCell(10, "COPYRIGHT STATEMENT:"); 
     JTextField copyrightStatementTextField = addMyTextFieldCell(10, ""); 

     // 12. 
     JLabel copyRightYearLabel = addMyLabelCell(11, "COPYRIGHT YEAR:"); 
     JTextField copyRightYearTextField = addMyTextFieldCell(11, ""); 
    } 

    public JLabel addMyLabelCell(int pos, String labelstr) { 
     GridBagConstraints gridBagConstraints = new GridBagConstraints(); 
     gridBagConstraints.gridx = 0; 
     gridBagConstraints.gridy = pos; 
     JLabel label = new JLabel(labelstr); 
     this.add(label, gridBagConstraints); 
     return label; 
    } 

    public JTextField addMyTextFieldCell(int pos, String text) { 
     GridBagConstraints gridBagConstraints = new GridBagConstraints(); 
     gridBagConstraints.anchor = GridBagConstraints.EAST; 
     gridBagConstraints.ipadx = 10; 
     JTextField textField = new JTextField(text); 
     gridBagConstraints.gridx = 1; 
     gridBagConstraints.gridy = pos; 
     textField.setColumns(10); 
     this.add(textField, gridBagConstraints); 
     return textField; 
    } 

    public static void main(String... args) { 
     SwingUtilities.invokeLater(() -> { 
      JFrame f = new JFrame(); 
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      f.add(new InitialPanel()); 
      f.setSize(300, 300); 
      f.setVisible(true); 
     }); 
    } 
} 

這裏是輸出:

enter image description here

+0

如果需要,可以在'inset'約束的幫助下添加行之間的間距(如圖所示):gridBagConstraints .insets = new Insets(0,0,8,0);' – afzalex 2014-10-20 19:05:35

+0

謝謝,但爲什麼我的[代碼](http://pastebin.com/4if42bza)無法按預期工作 - 我在哪裏做錯了? – 2014-10-20 19:30:51

+0

@Sandeep爲什麼你在你的代碼中放置了這麼多不必要的'新行'。 – afzalex 2014-10-20 19:41:01

1

所有行,gridy應該是行號,併爲gridx爲0的標籤和1文本字段。

更正你的代碼並確認問題得以解決

+0

也看到http://docs.oracle.com/javase/7/docs/api/java/awt/GridBagConstraints.html#gridx – Tedil 2014-10-20 18:17:28

+0

他可能有點棘手,因爲他在左上角有那個按鈕來丟掉東西。他可能需要將按鈕和標籤結合在JPanel上。 – 2014-10-20 18:27:24

+0

@HovercraftFullOfEels海報建議忽略按鈕 – ControlAltDel 2014-10-20 18:31:00