首页 > 编程语言 >【错误记录】Java AWT 图形界面编程报错 ( Exception in thread “main“ java.awt.AWTError: BoxLayout can‘t be shared )

【错误记录】Java AWT 图形界面编程报错 ( Exception in thread “main“ java.awt.AWTError: BoxLayout can‘t be shared )

时间:2023-02-04 12:33:13浏览次数:45  
标签:Exception 管理器 图形界面 add 报错 BoxLayout new Panel panel


文章目录

  • ​​一、报错信息​​
  • ​​二、问题分析​​
  • ​​三、解决方案​​






一、报错信息



尝试使用 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)

【错误记录】Java AWT 图形界面编程报错 ( Exception in thread “main“ java.awt.AWTError: BoxLayout can‘t be shared )_BoxLayout






二、问题分析



报错信息是

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

执行结果如下 :

【错误记录】Java AWT 图形界面编程报错 ( Exception in thread “main“ java.awt.AWTError: BoxLayout can‘t be shared )_Frame_02


标签:Exception,管理器,图形界面,add,报错,BoxLayout,new,Panel,panel
From: https://blog.51cto.com/u_14202100/6037106

相关文章