0

我试图在JPanel我的 Frame 中添加多个 s 并让它们每个都使用 aGroupLayout但由于某种原因,我要么得到NullPointerException要么Exception在 Thread main 中。我可能做错了什么,我该如何解决?

然后我会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

}
4

2 回答 2

4

抛出 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); glout2.setAutoCreateGaps(true); glout2.setAutoCreateContainerGaps(true); 使用 grouplayout 制作第二个面板并将出现在同一个框架中?

当然,这可以工作。当你尝试它时会发生什么?


编辑 3
异常堆栈跟踪表明您正在尝试将一个 GroupLayout 添加到多个容器中。但是您发布的代码并未反映此问题。请在最新编辑的底部添加另一个编辑,其中的代码会产生您在上面显示的异常。

于 2013-11-21T18:24:40.910 回答
0

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

于 2021-11-19T19:40:25.907 回答