如何将具有GroupLayout的面板添加到JFrame?

时间:2012-11-24 13:55:09

标签: java swing layout awt panel

如何将具有GroupLayout的面板添加到JFrame?还有许多其他小组。

我制作了一些FlowLayoutbtnPanel数组)的面板。我使用GroupLayoutbtnPanel2)将其添加到另一个面板。垂直,一切都很好。

但是如何将btnPanel2添加到框架中?

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);

导致问题的一行是

   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)

1 个答案:

答案 0 :(得分:4)

您遗失了HorizontalGroup中的GroupLayout

使用GroupLayout时,您必须指定水平和垂直布局。每个组件必须在每个组中指定一次。不这样做会导致IllegalStateException

请参阅:How to Use GroupLayout