2013-11-21 27 views
-1

Im試圖將多個JPanel s添加到我的Frame並使它們各自使用GroupLayout,但出於某種原因,我在Thread main中獲得NullPointerExceptionException。我可能會做錯什麼,我該如何解決它?如何在Grouplayout中使用多個JPanel

我會那麼做glayout2 = new GroupLayout(temp2Panel); temp2Panel.setLayout(glayout2); glayout2.setAutoCreateGaps(true); glayout2.setAutoCreateContainerGaps(true);要製作第二個面板groupplayout並將出現在相同的框架?

public class test extends JFrame { 
    /** 
    * 
    */ 
    private JLabel testing; 

    private JLabel lblcode; 
    private JLabel lblemployeedetails; 
    private JLabel lblname; 
    private JLabel lbladdress; 
    private JLabel lblcity; 
    private JLabel lblemail; 
    private JLabel lbltelnumber; 
    private JLabel lblcellnumber; 

    private JLabel lblprnumber; 
    private JLabel lblppe; 
    private JLabel lblppedate; 
    private JTextField txtprnumber; 
    private JTextField txtppe; 

    private JTextField txtcode; 
    private JTextField txtname; 
    private JTextField txtaddress; 
    private JTextField txtaddress2; 
    private JTextField txtcity; 
    private JTextField txtemail; 
    private JTextField txttelnumber; 
    private JTextField txtcellnumber; 

    private Container container1; 
    private Container container2; 

    private static final long serialVersionUID = 6666; 

    private JPanel mainPanel = new JPanel(); 
    private JPanel temp1Panel = new JPanel(); 
    private JPanel temp2Panel = new JPanel(); 

    private GroupLayout glayout; 

    public test() { 
     // Frame Parameters 
     setTitle("test"); 
     setSize(500,500);// Adjust size of the frame/window 
     setLocationRelativeTo(null);// Adjust open location 



     addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowClosing(WindowEvent e) { 
      System.exit(0); 
     } 
     }); 
/************************************************************* 
* Properties~Always initialize within the constructor FOOL 
*************************************************************/  
     testing = new JLabel("testing"); 

     lblcode= new JLabel("Code:"); 
     lblemployeedetails= new JLabel("Employee Details:"); 
     lblname= new JLabel("Name:"); 
     lbladdress= new JLabel("Address:"); 
     lblcity= new JLabel("City:"); 
     lblemail= new JLabel("Email:"); 
     lbltelnumber= new JLabel("Tel:"); 
     lblcellnumber= new JLabel("Cell:"); 
     lblprnumber = new JLabel("PR#:"); 
     lblppe = new JLabel("PPE:"); 
     lblppedate = new JLabel("PPE Date:"); 

     txtprnumber= new JTextField(); 
     txtppe= new JTextField(); 
     txtcode= new JTextField(); 
     txtname= new JTextField(); 
     txtaddress= new JTextField(); 
     txtaddress2= new JTextField(); 
     txtcity= new JTextField(); 
     txtemail= new JTextField(); 
     txttelnumber= new JTextField(); 
     txtcellnumber= new JTextField(); 
     //Below adding the 2 other panels to the main outer panel 
     temp1Panel = new JPanel(); 
     temp1Panel.add(container1); 
     temp2Panel = new JPanel(); 
     mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 
     mainPanel.add(temp1Panel); 
     mainPanel.add(temp2Panel); 

/************************************************************* 
*    GroupLayout for temp1Panel 
*************************************************************/ 

     container1 = getContentPane(); 
     glayout = new GroupLayout(temp1Panel); 
     temp1Panel.setLayout(glayout); 
     glayout.setAutoCreateGaps(true); 
     glayout.setAutoCreateContainerGaps(true); 


     glayout.setHorizontalGroup(
     glayout.createSequentialGroup() 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.LEADING) 
       .addComponent(lblprnumber) 
       .addComponent(lblcode) 
       .addComponent(lblname) 
       .addComponent(lbladdress) 
       .addComponent(lblcity) 
       .addComponent(lblemail) 
       .addComponent(lbltelnumber) 
       .addComponent(lblcellnumber)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.LEADING) 
       .addComponent(txtprnumber) 
       .addComponent(txtcode) 
       .addComponent(txtname) 
       .addComponent(txtaddress) 
       .addComponent(txtaddress2) 
       .addComponent(txtcity) 
       .addComponent(txtemail) 
       .addComponent(txttelnumber) 
       .addComponent(txtcellnumber)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.LEADING) 
       .addComponent(lblppe)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.LEADING) 
       .addComponent(txtppe) 
       .addComponent(lblemployeedetails)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.LEADING) 
       .addComponent(lblppedate)) 
    ); 

     glayout.setVerticalGroup(
     glayout.createSequentialGroup() 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
       .addComponent(lblprnumber) 
       .addComponent(txtprnumber) 
       .addComponent(lblppe) 
       .addComponent(txtppe) 
       .addComponent(lblppedate)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
       .addComponent(lblcode) 
       .addComponent(txtcode) 
       .addComponent(lblemployeedetails)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
       .addComponent(lblname) 
       .addComponent(txtname)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
       .addComponent(lbladdress) 
       .addComponent(txtaddress)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
       .addComponent(txtaddress2)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
       .addComponent(lblcity) 
       .addComponent(txtcity)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
       .addComponent(lblemail) 
       .addComponent(txtemail)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
       .addComponent(lbltelnumber) 
       .addComponent(txttelnumber)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
       .addComponent(lblcellnumber) 
       .addComponent(txtcellnumber)) 


    ); 

     this.setVisible(true); 

    }//test 

/************************************************************* 
* Main 
*************************************************************/ 

    public static void main(String[] args) { 
      new test(); 

     }//main 

} 

編輯3:這是我得到:

Exception in thread "main" java.lang.IllegalArgumentException: GroupLayout can only be used with one Container at a time 
    at javax.swing.GroupLayout.checkParent(Unknown Source) 
    at javax.swing.GroupLayout.invalidateLayout(Unknown Source) 
    at java.awt.Container.invalidate(Unknown Source) 
    at java.awt.Component.addNotify(Unknown Source) 
    at java.awt.Container.addNotify(Unknown Source) 
    at javax.swing.JComponent.addNotify(Unknown Source) 
    at java.awt.Container.addNotify(Unknown Source) 
    at javax.swing.JComponent.addNotify(Unknown Source) 
    at java.awt.Container.addNotify(Unknown Source) 
    at javax.swing.JComponent.addNotify(Unknown Source) 
    at java.awt.Container.addNotify(Unknown Source) 
    at javax.swing.JComponent.addNotify(Unknown Source) 
    at javax.swing.JRootPane.addNotify(Unknown Source) 
    at java.awt.Container.addNotify(Unknown Source) 
    at java.awt.Window.addNotify(Unknown Source) 
    at java.awt.Frame.addNotify(Unknown Source) 
    at java.awt.Window.show(Unknown Source) 
    at java.awt.Component.show(Unknown Source) 
    at java.awt.Component.setVisible(Unknown Source) 

編輯4:

public class test extends JFrame { 
    private static final int COLS = 30; 
    /** 
    * 
    */ 
    private JLabel testing; 

    private JLabel lblcode; 
    private JLabel lblemployeedetails; 
    private JLabel lblname; 
    private JLabel lbladdress; 
    private JLabel lblcity; 
    private JLabel lblemail; 
    private JLabel lbltelnumber; 
    private JLabel lblcellnumber; 

    private JLabel lblprnumber; 
    private JLabel lblppe; 
    private JLabel lblppedate; 
    private JTextField txtprnumber; 
    private JTextField txtppe; 

    private JTextField txtcode; 
    private JTextField txtname; 
    private JTextField txtaddress; 
    private JTextField txtaddress2; 
    private JTextField txtcity; 
    private JTextField txtemail; 
    private JTextField txttelnumber; 
    private JTextField txtcellnumber; 

    private static final long serialVersionUID = 6666; 

    private JPanel mainPanel = new JPanel(); 
    private JPanel temp1Panel = new JPanel(); 
    private JPanel temp2Panel = new JPanel(); 

    private GroupLayout glayout; 
    private GroupLayout glayout2; 

    public test() { 
     // Frame Parameters 
     setTitle("test"); 
     setSize(500,500);// Adjust size of the frame/window 
     setLocationRelativeTo(null);// Adjust open location 



     addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowClosing(WindowEvent e) { 
      System.exit(0); 
     } 
     }); 
/************************************************************* 
* Properties~Always initialize within the constructor FOOL 
*************************************************************/ 
     testing = new JLabel("test"); 

     lblcode = new JLabel("Code:"); 
     lblemployeedetails = new JLabel("Employee Details:"); 
     lblname = new JLabel("Name:"); 
     lbladdress = new JLabel("Address:"); 
     lblcity = new JLabel("City:"); 
     lblemail = new JLabel("Email:"); 
     lbltelnumber = new JLabel("Tel:"); 
     lblcellnumber = new JLabel("Cell:"); 
     lblprnumber = new JLabel("PR#:"); 
     lblppe = new JLabel("PPE:"); 
     lblppedate = new JLabel("PPE Date:"); 

     txtprnumber = new JTextField(COLS); 
     txtppe = new JTextField(COLS); 
     txtcode = new JTextField(COLS); 
     txtname = new JTextField(COLS); 
     txtaddress = new JTextField(COLS); 
     txtaddress2 = new JTextField(COLS); 
     txtcity = new JTextField(COLS); 
     txtemail = new JTextField(COLS); 
     txttelnumber = new JTextField(COLS); 
     txtcellnumber = new JTextField(COLS); 
     //Below adding the 2 other panels to the main outer panel 
     temp1Panel = new JPanel(); 
     temp2Panel = new JPanel(); 
     mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 
     mainPanel.add(temp1Panel); 
     mainPanel.add(temp2Panel); 
/************************************************************* 
*    GroupLayout for temp1Panel 
*************************************************************/ 

     getContentPane().add(temp1Panel);//mainPanel 

     glayout = new GroupLayout(temp1Panel); 
     temp1Panel.setLayout(glayout); 
     glayout.setAutoCreateGaps(true); 
     glayout.setAutoCreateContainerGaps(true); 

     glayout.setHorizontalGroup(
     glayout.createSequentialGroup() 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.LEADING) 
       .addComponent(lblprnumber) 
       .addComponent(lblcode) 
       .addComponent(lblname) 
       .addComponent(lbladdress) 
       .addComponent(lblcity) 
       .addComponent(lblemail) 
       .addComponent(lbltelnumber) 
       .addComponent(lblcellnumber)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.LEADING) 
       .addComponent(txtprnumber) 
       .addComponent(txtcode) 
       .addComponent(txtname) 
       .addComponent(txtaddress) 
       .addComponent(txtaddress2) 
       .addComponent(txtcity) 
       .addComponent(txtemail) 
       .addComponent(txttelnumber) 
       .addComponent(txtcellnumber)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.LEADING) 
       .addComponent(lblppe)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.LEADING) 
       .addComponent(txtppe) 
       .addComponent(lblemployeedetails)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.LEADING) 
       .addComponent(lblppedate)) 
    ); 

     glayout.setVerticalGroup(
     glayout.createSequentialGroup() 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
       .addComponent(lblprnumber) 
       .addComponent(txtprnumber) 
       .addComponent(lblppe) 
       .addComponent(txtppe) 
       .addComponent(lblppedate)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
       .addComponent(lblcode) 
       .addComponent(txtcode) 
       .addComponent(lblemployeedetails)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
       .addComponent(lblname) 
       .addComponent(txtname)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
       .addComponent(lbladdress) 
       .addComponent(txtaddress)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
       .addComponent(txtaddress2)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
       .addComponent(lblcity) 
       .addComponent(txtcity)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
       .addComponent(lblemail) 
       .addComponent(txtemail)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
       .addComponent(lbltelnumber) 
       .addComponent(txttelnumber)) 
      .addGroup(glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
       .addComponent(lblcellnumber) 
       .addComponent(txtcellnumber)) 

    ); 

     getContentPane().add(temp2Panel); 

     glayout2 = new GroupLayout(temp2Panel); 
     temp1Panel.setLayout(glayout2); 
     glayout2.setAutoCreateGaps(true); 
     glayout2.setAutoCreateContainerGaps(true); 

     glayout2.setHorizontalGroup(
      glayout2.createSequentialGroup() 
       .addGroup(glayout2.createParallelGroup(GroupLayout.Alignment.LEADING) 
        .addComponent(testing)) 

    ); 

     glayout2.setVerticalGroup(
      glayout2.createSequentialGroup() 
       .addGroup(glayout2.createParallelGroup(GroupLayout.Alignment.BASELINE) 
        .addComponent(testing)) 

    ); 






     this.setVisible(true); 

    }//test 

/************************************************************* 
* Main 
*************************************************************/ 

    public static void main(String[] args) { 
      new test(); 

     }//main 

} 
+0

什麼行會拋出異常? –

+0

查看編輯3回答。異常堆棧跟蹤表明您正試圖將一個GroupLayout添加到多個容器。請在這個底部添加另一個編輯,其中一個顯示產生您在上面顯示的異常的代碼。 –

回答

3

拋出了NPE會告訴你什麼是錯行:

temp1Panel.add(container1); 

您試圖使用組件container1,在它被初始化之前。

建議:

  • 不要這樣做。在使用變量前先初始化變量。
  • 不要剔除異常,而是批判性地閱讀它們並研究引發它們的線條,因爲這樣做會爲您節省大量時間。
  • 如果您將來有異常需要幫助,請務必發佈異常堆棧跟蹤,並在您的發佈代碼中註明明顯的註釋// **** NullPointerException here ****
  • 你的代碼有點奇怪。您似乎正在將contentPane添加到您的某個組件 - 它應該是相反的。你編寫的代碼如果編譯將顯示組件。
  • 我同意Sage的說法,GroupLayout很難與手工編碼一起工作,但是他說過,這不是不可能的,而且我之前使用過它。

編輯

  • 你甚至不爲你做什麼用它需要的container1變量。實質上,它會讓你感到困擾,並且沒有價值,所以要擺脫它。

您的代碼進行一些修改:

import java.awt.event.*; 
import javax.swing.*; 

public class Test extends JFrame { 
    private static final long serialVersionUID = 6666; 
    private static final int COLS = 10; 

    private JLabel lblcode; 
    private JLabel lblemployeedetails; 
    private JLabel lblname; 
    private JLabel lbladdress; 
    private JLabel lblcity; 
    private JLabel lblemail; 
    private JLabel lbltelnumber; 
    private JLabel lblcellnumber; 

    private JLabel lblprnumber; 
    private JLabel lblppe; 
    private JLabel lblppedate; 
    private JTextField txtprnumber; 
    private JTextField txtppe; 

    private JTextField txtcode; 
    private JTextField txtname; 
    private JTextField txtaddress; 
    private JTextField txtaddress2; 
    private JTextField txtcity; 
    private JTextField txtemail; 
    private JTextField txttelnumber; 
    private JTextField txtcellnumber; 

    private JPanel mainPanel = new JPanel(); 
    private JPanel temp1Panel = new JPanel(); 
    private JPanel temp2Panel = new JPanel(); 

    private GroupLayout glayout; 

    public Test() { 
     // Frame Parameters 
     setTitle("test"); 
     // !! setSize(500, 500);// Adjust size of the frame/window 
     // !! setLocationRelativeTo(null);// Adjust open location 

     addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowClosing(WindowEvent e) { 
      System.exit(0); 
     } 
     }); 
     // !! testing = new JLabel("testing"); 

     lblcode = new JLabel("Code:"); 
     lblemployeedetails = new JLabel("Employee Details:"); 
     lblname = new JLabel("Name:"); 
     lbladdress = new JLabel("Address:"); 
     lblcity = new JLabel("City:"); 
     lblemail = new JLabel("Email:"); 
     lbltelnumber = new JLabel("Tel:"); 
     lblcellnumber = new JLabel("Cell:"); 
     lblprnumber = new JLabel("PR#:"); 
     lblppe = new JLabel("PPE:"); 
     lblppedate = new JLabel("PPE Date:"); 

     // !! add COLS column size field 
     txtprnumber = new JTextField(COLS); 
     txtppe = new JTextField(COLS); 
     txtcode = new JTextField(COLS); 
     txtname = new JTextField(COLS); 
     txtaddress = new JTextField(COLS); 
     txtaddress2 = new JTextField(COLS); 
     txtcity = new JTextField(COLS); 
     txtemail = new JTextField(COLS); 
     txttelnumber = new JTextField(COLS); 
     txtcellnumber = new JTextField(COLS); 
     temp1Panel = new JPanel(); 

     // add before using: 
     // !! container1 = getContentPane(); // !! 
     // !! temp1Panel.add(container1); 
     temp2Panel = new JPanel(); 
     mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 
     mainPanel.add(temp1Panel); 
     mainPanel.add(temp2Panel); 

     getContentPane().add(mainPanel); // !! 

     glayout = new GroupLayout(temp1Panel); 
     temp1Panel.setLayout(glayout); 
     glayout.setAutoCreateGaps(true); 
     glayout.setAutoCreateContainerGaps(true); 

     glayout 
      .setHorizontalGroup(glayout 
        .createSequentialGroup() 
        .addGroup(
         glayout 
           .createParallelGroup(
            GroupLayout.Alignment.LEADING) 
           .addComponent(lblprnumber).addComponent(lblcode) 
           .addComponent(lblname).addComponent(lbladdress) 
           .addComponent(lblcity).addComponent(lblemail) 
           .addComponent(lbltelnumber) 
           .addComponent(lblcellnumber)) 
        .addGroup(
         glayout 
           .createParallelGroup(
            GroupLayout.Alignment.LEADING) 
           .addComponent(txtprnumber).addComponent(txtcode) 
           .addComponent(txtname).addComponent(txtaddress) 
           .addComponent(txtaddress2).addComponent(txtcity) 
           .addComponent(txtemail) 
           .addComponent(txttelnumber) 
           .addComponent(txtcellnumber)) 
        .addGroup(
         glayout.createParallelGroup(
           GroupLayout.Alignment.LEADING).addComponent(
           lblppe)) 
        .addGroup(
         glayout 
           .createParallelGroup(
            GroupLayout.Alignment.LEADING) 
           .addComponent(txtppe) 
           .addComponent(lblemployeedetails)) 
        .addGroup(
         glayout.createParallelGroup(
           GroupLayout.Alignment.LEADING).addComponent(
           lblppedate))); 

     glayout.setVerticalGroup(glayout 
      .createSequentialGroup() 
      .addGroup(
        glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
         .addComponent(lblprnumber).addComponent(txtprnumber) 
         .addComponent(lblppe).addComponent(txtppe) 
         .addComponent(lblppedate)) 
      .addGroup(
        glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
         .addComponent(lblcode).addComponent(txtcode) 
         .addComponent(lblemployeedetails)) 
      .addGroup(
        glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
         .addComponent(lblname).addComponent(txtname)) 
      .addGroup(
        glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
         .addComponent(lbladdress).addComponent(txtaddress)) 
      .addGroup(
        glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
         .addComponent(txtaddress2)) 
      .addGroup(
        glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
         .addComponent(lblcity).addComponent(txtcity)) 
      .addGroup(
        glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
         .addComponent(lblemail).addComponent(txtemail)) 
      .addGroup(
        glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
         .addComponent(lbltelnumber).addComponent(txttelnumber)) 
      .addGroup(
        glayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
         .addComponent(lblcellnumber) 
         .addComponent(txtcellnumber)) 

    ); 

     pack(); // !! 
     setLocationRelativeTo(null); // !! 
     this.setVisible(true); 

    } 

    public static void main(String[] args) { 
     new Test(); 

    } 

} 

編輯2關於你的編輯你的問題,

我會那麼做glayout2 =新的GroupLayout(temp2Panel) ; temp2Panel.setLayout(glayout2); glayout2.setAutoCreateGaps(真); glayout2.setAutoCreateContainerGaps(真);要使用groupplayout製作第二個面板並將顯示在同一個框架中?

當然,這可以工作。當你嘗試時會發生什麼?


編輯3
異常堆棧跟蹤表明,你想一個GroupLayout的增加不止一個容器。但是你的發佈代碼並不能反映這個問題。請在您的最新版本的底部添加另一個編輯,其中一個編碼會產生您在上面顯示的異常。

+2

這可能只是爲了我,但我不想在手工編碼時更喜歡使用'GroupLayout'。它比任何其他佈局管理器都要冗長得多。 – Sage

+0

然後我會做glayout2 = new GroupLayout(temp2Panel); temp2Panel.setLayout(glayout2); glayout2.setAutoCreateGaps(true); glayout2.setAutoCreateContainerGaps(true); 要製作第二個帶groupplayout的面板並且會出現在同一個框架中? – user2933563

+0

@ user2933563:肯定可以工作。當你嘗試時會發生什麼? –

相關問題