文章目录
- 一、报错信息
- 二、问题分析
- 三、解决方案
一、报错信息
尝试使用 Panel 实现线性布局 , 为 Panel 设置 BoxLayout 布局管理器 ;
执行如下代码 :
import javax.swing.*;
import java.awt.*;
public class HelloAWT {
public static void main(String[] args) throws InterruptedException {
// Frame 默认的布局管理器就是 BorderLayout
Frame frame = new Frame("AWT 界面编程");
Panel panel = new Panel();
panel.setLayout(new BoxLayout(frame, BoxLayout.X_AXIS));
frame.add(panel);
Panel panel1 = new Panel();
panel1.setBackground(Color.BLUE);
panel.add(panel1);
Panel panel2 = new Panel();
panel2.setBackground(Color.RED);
panel.add(panel2);
Panel panel3 = new Panel();
panel3.setBackground(Color.BLACK);
panel.add(panel3);
Panel panel4 = new Panel();
panel4.setBackground(Color.GREEN);
panel.add(panel4);
Panel panel5 = new Panel();
panel5.setBackground(Color.MAGENTA);
panel.add(panel5);
frame.pack();
frame.setVisible(true);
}
}
报错信息如下 :
Exception in thread "main" java.awt.AWTError: BoxLayout can't be shared
at javax.swing.BoxLayout.checkContainer(BoxLayout.java:465)
at javax.swing.BoxLayout.invalidateLayout(BoxLayout.java:249)
at javax.swing.BoxLayout.addLayoutComponent(BoxLayout.java:282)
at java.awt.Container.addImpl(Container.java:1127)
at java.awt.Container.add(Container.java:417)
at HelloAWT.main(HelloAWT.java:16)
二、问题分析
报错信息是
panel.add(panel1);
代码 , 也就是添加第一个组件时报错 ;
这是因为创建布局管理器时出现的问题 , 创建布局管理器代码 :
new BoxLayout(frame, BoxLayout.X_AXIS)
分析其 构造函数 原型 如下 ,
/**
* 创建一个布局管理器,该管理器将沿着给定的轴布局组件。
*
* @param target 需要布置的容器
* @param axis 沿轴线布置组件。可以是其中之一:
* <code>BoxLayout.X_AXIS</code>,
* <code>BoxLayout.Y_AXIS</code>,
* <code>BoxLayout.LINE_AXIS</code> or
* <code>BoxLayout.PAGE_AXIS</code>
*
* @exception AWTError 如果<code>axis</code>的值无效
*/
@ConstructorProperties({"target", "axis"})
public BoxLayout(Container target, int axis) {
if (axis != X_AXIS && axis != Y_AXIS &&
axis != LINE_AXIS && axis != PAGE_AXIS) {
throw new AWTError("Invalid axis");
}
this.axis = axis;
this.target = target;
}
出错的代码不是 panel.add(panel1);
, 而是创建和设置布局管理器的代码
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
创建布局管理器 , 构造函数的第一个参数 必须是 该 BoxLayout 布局管理器 要作用的容器组件 , 上述代码中 ,
先创建 Frame 窗口 , 在 Frame 窗口中添加 Panel 作为第二层容器 ,
最后为 Panel 设置 BoxLayout 布局管理器 , 让 Panel 中的容器线性排列 ;
使用
new BoxLayout(frame, BoxLayout.X_AXIS)
代码创建布局管理器 , 显然不符合要求 , 如果要为 Panel 容器设置布局管理器 , 创建时需要传入 Panel 实例对象作为第一个参数 , 而不是 Frame 窗口实例对象 ;
将 Frame 实例改为 Panel 对象即可 ;
三、解决方案
按照上述问题分析 , 将 Frame 实例改为 Panel 对象 ;
修改后的代码 :
import javax.swing.*;
import java.awt.*;
public class HelloAWT {
public static void main(String[] args) throws InterruptedException {
// Frame 默认的布局管理器就是 BorderLayout
Frame frame = new Frame("AWT 界面编程");
Panel panel = new Panel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
frame.add(panel);
Panel panel1 = new Panel();
panel1.setBackground(Color.BLUE);
panel.add(panel1);
Panel panel2 = new Panel();
panel2.setBackground(Color.RED);
panel.add(panel2);
Panel panel3 = new Panel();
panel3.setBackground(Color.BLACK);
panel.add(panel3);
Panel panel4 = new Panel();
panel4.setBackground(Color.GREEN);
panel.add(panel4);
Panel panel5 = new Panel();
panel5.setBackground(Color.MAGENTA);
panel.add(panel5);
frame.pack();
frame.setVisible(true);
}
}
执行结果如下 :