簡體   English   中英

如何在 Grouplayout 中使用多個 JPanel

[英]How to use more than one JPanel with Grouplayout

我試圖將多個JPanel s 添加到我的 Frame 並讓它們每個都使用GroupLayout但由於某種原因,我要么在 Thread main 中獲得NullPointerExceptionException 我可能做錯了什么,我該如何解決?

然后我會做glayout2 = new GroupLayout(temp2Panel); temp2Panel.setLayout(glayout2); glayout2.setAutoCreateGaps(true); glayout2.setAutoCreateContainerGaps(true); glayout2 = new GroupLayout(temp2Panel); temp2Panel.setLayout(glayout2); glayout2.setAutoCreateGaps(true); glayout2.setAutoCreateContainerGaps(true); 要使用 grouplayout 制作第二個面板並將出現在同一個框架中?

    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

}

引發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 = new GroupLayout(temp2Panel);嗎? temp2Panel.setLayout(glayout2); glayout2.setAutoCreateGaps(true); glayout2.setAutoCreateContainerGaps(true); 要使用grouplayout制作第二個面板並將其顯示在同一Frame中?

當然可以。 嘗試時會發生什么?


編輯3
異常stacktrace建議您嘗試將一個GroupLayout添加到多個容器中。 但是您發布的代碼不能反映此問題。 請在最新編輯的底部添加另一編輯,其中的代碼會產生上面顯示的異常。

1 / 首先你必須在你的 JFrame 中做 JLayeredPane: JLayeredPane panel_Contenu = new JLayeredPane (); 2 / 然后你可以為 JLayeredPane panel_Contenu.setLayout (new CardLayout (0, 0));做 CardLayout panel_Contenu.setLayout (new CardLayout (0, 0)); 3 / 最后在JLayeredPane panel_Contenu.add (enter here the JPanel of other class you want to added);添加其他JPanel panel_Contenu.add (enter here the JPanel of other class you want to added);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM