问题
This question already has an answer here:
- BoxLayout can't be shared error 4 answers
I have initialized MotePanel, Command Panel and LEDPanel before setting their Layout, then how so am I getting this exception.
Please help.
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.<init>(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);
}
回答1:
When calling setLayout on a JFrame, you're actually adding the layout to the JFrame's contentPane not the JFrame itself since this method is more of a convenience method that transmits the method call to the contentPane. The BoxLayout constructor must reflect this since you can't add the BoxLayout to one container and then pass in as a parameter a different container. So change this:
this.setLayout(new BoxLayout(this,BoxLayout.X_AXIS));
to this:
setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS));
Also: no need for all the this.
business since this. is implied, and also there is no actual need here to extend JFrame.
edit: this code below is all that is needed to demonstrate your error and its solution:
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();
}
}
回答2:
You should set the BoxLayout with the contentPane of the JFrame, not the JFrame itself -
this.setLayout(new BoxLayout(this.getContentPane(),BoxLayout.X_AXIS));
instead of
this.setLayout(new BoxLayout(this,BoxLayout.X_AXIS));
回答3:
I believe this will make things more clear, just try to be more explicit about your code: this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS));
来源:https://stackoverflow.com/questions/5917017/java-awt-awterror-boxlayout-cant-be-shared