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

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了错误记录Java AWT 图形界面编程报错 ( Exception in thread “main“ java.awt.AWTError: BoxLayout can‘t be shared )相关的知识,希望对你有一定的参考价值。

文章目录





一、报错信息



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

执行结果如下 :

以上是关于错误记录Java AWT 图形界面编程报错 ( Exception in thread “main“ java.awt.AWTError: BoxLayout can‘t be shared )的主要内容,如果未能解决你的问题,请参考以下文章

错误记录Java AWT 图形界面编程问题 ( 组件按照布局要求设置后无法显示等各种问题 )

Java图形界面编程

Java AWT 图形界面编程Container 容器总结

Java AWT 图形界面编程Container 容器总结

Java AWT 图形界面编程AWT 简介 ( AWT 核心类继承体系 )

java之 22天 GUI 图形界面编程