java.awt.AWTError:BoxLayout无法共享

我在设置布局之前初始化了MotePanel,Command Panel和LEDPanel,那么我是如何得到这个例外的。

请帮忙。

Exception in thread "main" java.awt.AWTError: BoxLayout can't be shared at javax.swing.BoxLayout.checkContainer(BoxLayout.java:462) at javax.swing.BoxLayout.invalidateLayout(BoxLayout.java:246) at javax.swing.BoxLayout.addLayoutComponent(BoxLayout.java:279) at java.awt.Container.addImpl(Container.java:1107) at java.awt.Container.add(Container.java:974) at javax.swing.JFrame.addImpl(JFrame.java:556) at java.awt.Container.add(Container.java:377) at Window.(Window.java:54) 

 public class Window extends JFrame{ private JPanel MotePanel; private JPanel LEDPanel; private JPanel CommandPanel; private JCheckBox motes[]; private JRadioButton Leds[]; public Window(){ this.setLayout(new BoxLayout(this,BoxLayout.X_AXIS)); this.setTitle("Sensor Networks Lab"); this.setSize(300, 200); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(EXIT_ON_CLOSE); MotePanel = new JPanel(); LEDPanel = new JPanel(); CommandPanel = new JPanel(); motes = new JCheckBox[10]; Leds = new JRadioButton[3]; MotePanel.setLayout(new BoxLayout(MotePanel, BoxLayout.Y_AXIS)); CommandPanel.setLayout(new BoxLayout(CommandPanel, BoxLayout.Y_AXIS)); LEDPanel.setLayout(new BoxLayout(LEDPanel, BoxLayout.Y_AXIS)); System.out.println("creating MotePanel"); for(int i=0; i<10; i++){ motes[i] = new JCheckBox("Mote "+i); MotePanel.add(motes[i]); } System.out.println("creating LEDPanel"); for(int i=0; i<3; i++) Leds[i] = new JRadioButton(); Leds[0].setText("RED"); LEDPanel.add(Leds[0]); Leds[1].setText("GREEN"); LEDPanel.add(Leds[1]); Leds[2].setText("BLUE"); LEDPanel.add(Leds[2]); this.add(MotePanel); this.add(LEDPanel); this.add(CommandPanel); } 

在JFrame上调用setLayout时,实际上是将布局添加到JFrame的contentPane而不是JFrame本身,因为此方法更像是将方法调用传递给contentPane的便捷方法。 BoxLayout构造函数必须反映这一点,因为您无法将BoxLayout添加到一个容器,然后作为参数传入另一个容器。 所以改变这个:

 this.setLayout(new BoxLayout(this,BoxLayout.X_AXIS)); 

对此:

 setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS)); 

另外:不需要this.一切this. 此事业务。 暗示,这里也没有实际需要扩展JFrame。

编辑:以下代码是演示您的错误及其解决方案所需的全部内容:

 import javax.swing.*; public class BoxLayoutFoo extends JFrame { public BoxLayoutFoo() { // swap the comments below setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS)); // comment out this line //setLayout(new BoxLayout(getContentPane(), BoxLayout.LINE_AXIS)); // uncomment this line setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true); } public static void main(String[] args) { new BoxLayoutFoo(); } } 

你应该使用JFrame的contentPane设置BoxLayout,而不是JFrame本身 –

 this.setLayout(new BoxLayout(this.getContentPane(),BoxLayout.X_AXIS)); 

代替

 this.setLayout(new BoxLayout(this,BoxLayout.X_AXIS)); 

我相信这会让事情变得更清楚,只是试着更明确地对你的代码: this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS));