前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【错误记录】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-03-30 18:57:10
4470
发布2023-03-30 18:57:10
举报

文章目录

一、报错信息


尝试使用 Panel 实现线性布局 , 为 Panel 设置 BoxLayout 布局管理器 ;

执行如下代码 :

代码语言:javascript
复制
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);
    }
}

报错信息如下 :

代码语言:javascript
复制
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)
在这里插入图片描述
在这里插入图片描述

二、问题分析


报错信息是

代码语言:javascript
复制
panel.add(panel1);

代码 , 也就是添加第一个组件时报错 ;

这是因为创建布局管理器时出现的问题 , 创建布局管理器代码 :

代码语言:javascript
复制
new BoxLayout(frame, BoxLayout.X_AXIS)

分析其 构造函数 原型 如下 ,

代码语言:javascript
复制
    /**
     * 创建一个布局管理器,该管理器将沿着给定的轴布局组件。
     *
     * @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); , 而是创建和设置布局管理器的代码

代码语言:javascript
复制
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));

创建布局管理器 , 构造函数的第一个参数 必须是 该 BoxLayout 布局管理器 要作用的容器组件 , 上述代码中 ,

先创建 Frame 窗口 , 在 Frame 窗口中添加 Panel 作为第二层容器 ,

最后为 Panel 设置 BoxLayout 布局管理器 , 让 Panel 中的容器线性排列 ;

使用

代码语言:javascript
复制
new BoxLayout(frame, BoxLayout.X_AXIS)

代码创建布局管理器 , 显然不符合要求 , 如果要为 Panel 容器设置布局管理器 , 创建时需要传入 Panel 实例对象作为第一个参数 , 而不是 Frame 窗口实例对象 ;

将 Frame 实例改为 Panel 对象即可 ;

三、解决方案


按照上述问题分析 , 将 Frame 实例改为 Panel 对象 ;

修改后的代码 :

代码语言:javascript
复制
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);
    }
}

执行结果如下 :

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-01-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、报错信息
  • 二、问题分析
  • 三、解决方案
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档