Ifti
Ifti

Reputation: 77

How to add a panel with GroupLayout to a JFrame?

How to add a panel with GroupLayout to a JFrame? There are many other panels, too.

I made some panels with FlowLayout (btnPanel array). I added them to another panel with GroupLayout (btnPanel2). Vertically, all fine.

But how to add btnPanel2 to a frame?

public static String[][] NORMAL_BUTTONS = {
    {"MC", "MR", "MS", "M+" ,"M-"},
    {"<-", "CE", "C" , "+/-","√"  },
    {"7" , "8" , "9" , "/"  ,"%" },
    {"4" , "5" , "6" , "*"  ,"1/x"},
    {"1", "2", "3", "-","="},
    {"0", ".", " ","+"}
};

Panel BtnPanel[]=new Panel[6];//(new FlowLayout());
  BtnPanel[0]=new Panel();
  BtnPanel[0].setLayout(new FlowLayout());

 for(int i=0;i< NORMAL_BUTTONS.length;i++){
     BtnPanel[i]=new Panel();
     BtnPanel[i].setLayout(new FlowLayout());

     for(int j=0;j<NORMAL_BUTTONS[i].length;j++)
     {
     Button btn = new Button(NORMAL_BUTTONS[i][j]);
     // btn.setFont(BTN_FONT);
     BtnPanel[i].add(btn);       
     }
 }

 JPanel BtnPanel2=new JPanel();
 GroupLayout myl=new GroupLayout(BtnPanel2);
 myl.setAutoCreateGaps(true);
 myl.setAutoCreateContainerGaps(true);

 myl.setVerticalGroup(myl.createSequentialGroup()
         .addGroup(myl.createParallelGroup(GroupLayout.Alignment.BASELINE))

               // THE FOLLOWING PANELS SHOULD HE VERTICALLY ALIGNED 
                // THE FOLLOWING PANELS SHOULD HE VERTICALLY ALIGNED  
               .addComponent(BtnPanel[0]) 
           .addComponent(BtnPanel[1])
           .addComponent(BtnPanel[2])
           .addComponent(BtnPanel[3])
           .addComponent(BtnPanel[4])
           .addComponent(BtnPanel[5])

        );

 BtnPanel2.setLayout(myl);

The line that causes the problem is following

   frame.add(BtnPanel2,BorderLayout.EAST);
Exception in thread "main" java.lang.IllegalStateException: java.awt.Panel[panel0,0,0,0x0,invalid,layout=java.awt.FlowLayout] is not attached to a horizontal group
    at javax.swing.GroupLayout.checkComponents(Unknown Source)
    at javax.swing.GroupLayout.prepare(Unknown Source)
    at javax.swing.GroupLayout.preferredLayoutSize(Unknown Source)
    at java.awt.Container.preferredSize(Unknown Source)
    at java.awt.Container.getPreferredSize(Unknown Source)
    at javax.swing.JComponent.getPreferredSize(Unknown Source)
    at java.awt.BorderLayout.preferredLayoutSize(Unknown Source)
    at java.awt.Container.preferredSize(Unknown Source)
    at java.awt.Container.getPreferredSize(Unknown Source)
    at javax.swing.JComponent.getPreferredSize(Unknown Source)
    at javax.swing.JRootPane$RootLayout.preferredLayoutSize(Unknown Source)
    at java.awt.Container.preferredSize(Unknown Source)
    at java.awt.Container.getPreferredSize(Unknown Source)
    at javax.swing.JComponent.getPreferredSize(Unknown Source)
    at java.awt.BorderLayout.preferredLayoutSize(Unknown Source)
    at java.awt.Container.preferredSize(Unknown Source)
    at java.awt.Container.getPreferredSize(Unknown Source)
    at java.awt.Window.pack(Unknown Source)
    at myPackage.Calc.createAndShowGui(Test.java:188)
    at myPackage.Test.main(Test.java:199)

Upvotes: 1

Views: 2512

Answers (1)

Reimeus
Reimeus

Reputation: 159754

You are missing a HorizontalGroup in your GroupLayout.

When using a GroupLayout, you have to specify a Horizontal and a Vertical layout. Each component must be specified exactly once in each group. Not doing this causes an IllegalStateException.

See: How to Use GroupLayout

Upvotes: 4

Related Questions