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

news2024/11/18 15:42:05

文章目录

  • 一、AWT 简介
  • 二、AWT 核心类继承体系
  • 三、Container 容器类子类
  • 四、Container 容器常用 API
  • 五、Frame 窗口示例
  • 六、Panel 示例
  • 七、窗口中文乱码处理
  • 八、ScrollPane 可滚动容器示例





一、AWT 简介



Java 中 使用 AWTSwing 进行 图形界面开发 ,
AWT 是 抽象窗口工具集 , Abstract Window Toolkit , AWT 功能比较简单 ,
Swing 提供了更加丰富的界面组件库 ;


通过 AWT 创建按钮 , 并设置对应的按钮点击事件 ,
但是 具体的在 Windows 或 Linux 平台创建按钮的操作不是由 AWT 完成的 ,
而是 由 JVM 调用本地平台的 API 进行创建的 ,
AWT 只是 抽象窗口工具集 , 具体的图形界面是由 Java 虚拟机调用本地 API 实现的 ;

由于 AWT 创建的界面都是由 JVM 调用本地 API 实现 ,
因此创建的 图形界面风格 , 都与 Java 程序运行的平台相关 ,
在 Windows 系统中运行 , 显示的是 Windows 界面的风格 , 在 Linux 系统运行 , 显示的是 Linux 界面风格 ;





二、AWT 核心类继承体系



AWT 核心类继承体系 : AWT 中最终要的两个类是 Component 组件类MenuComponent 菜单组件类 ;

  • Component 组件类 : 可交互的组件对象 , 如 : Button 按钮 , TextField 文本框等 ;
    • Container 组件 : Component 组件类 的子类 , 是一种 特殊的容器组件 , 可以容纳普通的 Component 组件 ;
  • MenuComponent 菜单组件类 : 菜单组件 , 如 : MenuBar 菜单条 , MenuItem 菜单组件 ;

LayoutManager 布局管理器 : AWT 中的 LayoutManager 布局管理器 也是重要的 接口 , 实现如 : GridLayout , FlowLayout 等 , 用于 管理多个组件的布局排列 ;


在 AWT 中使用 Component 组件类 和 MenuComponent 菜单组件类 展示基本的界面效果 ,
如果有多个组件关联性很强则需要使用 Container 组件 对这些组件进行封装 ,
封装后使用 LayoutManager 布局管理器 排列其中封装的组件 ;





三、Container 容器类子类



Container 容器类 , 继承自 Component 组件类 , 因此 Component 中的成员 属性与方法 , 在 Container 中也可以使用 ;

public class Container extends Component

Container 容器类 又有如下几个子类 : 这些容器类子类也都是容器 , 都有一个 默认的 布局管理器 ;

  • Window 窗口容器 : 该类有如下 2 个子类 , Frame 和 Dialog , 默认的 布局管理器 是 BorderLayout ;
    • Frame 是窗口类 ;
    • Dialog 是对话框类 ;
  • Panel 内嵌容器 : 该类有一个子类 Applet 类 , 默认的 布局管理器 是 FlowLayout ;
  • ScrollPanel 可滚动容器 : 默认的 布局管理器 是 BorderLayout ;




四、Container 容器常用 API



Container 容器类Component 组件类 的子类 , 因此 Container 中也可以调用 Component 中的函数 , 这里首先介绍 Component 组件类 的 常用 API , 然后再介绍 Container 容器类的 API ;


Component 组件类 常用 API :

  • setLocation(int x, int y) : 设置 组件 在 屏幕中的位置 , 屏幕中默认的坐标体系 , 左上角为原点 , 向右为 x 轴 , 向下为 y 轴 , 与 Android 的屏幕坐标系 类似 ;
  • setSize(int width, int height) : 设置 组件 大小 , 单位是像素值 ;
  • setBounds(int x, int y, int width, int height) : 同时设置 组件 在屏幕中的位置 和 组件 像素大小 ;
  • setVisible(boolean b) : 设置组件是否可见 , true 可见 , false 不可见 ;

Container 容器类 常用 API :

  • Component add(Component c) :Container 容器 添加 Component 组件 实例对象 , 返回被添加的组件 ; 注意 Container 是 Component 的子类 , 因此 此处也可以添加 Container 容器 ;
  • Component getComponentAt(int x, int y) : 返回指定 屏幕坐标 位置的组件 ;
  • int getComponentCount() : 获取 Container 容器 中的 Component 组件个数 ;
  • Component[] getComponent() : 获取 Container 容器中的所有 Component 组件 ;




五、Frame 窗口示例



首先 , 创建 Frame 实例对象 , 该对象就是 操作系统中应用软件的 窗口 ;

// 1. 创建窗口
Frame frame = new Frame("AWT 图形界面编程");

Frame 是 Window 的子类 ,

public class Frame extends Window implements MenuContainer

Window 是 Container 的子类 ;

public class Window extends Container implements Accessible

然后 , 设置窗口的位置 , 这里调用 Component#setLocation 函数 设置窗口在屏幕中的位置 ;

// 2. 设置窗口位置
frame.setLocation(50, 50);

再后 , 设置窗口大小 , 这里调用 Component#setSize 函数 设置窗口的像素大小 ;

// 3. 设置窗口大小
frame.setSize(800, 500);

最后 , 设置窗口可见 , 窗口默认不可见 , 需要手动设置可见性 ;

// 4. 设置窗口可见
frame.setVisible(true);

完整代码示例 :

import java.awt.*;

public class HelloAWT {
    public static void main(String[] args) {
        // 1. 创建窗口
        Frame frame = new Frame("AWT 图形界面编程");

        // 2. 设置窗口位置
        frame.setLocation(50, 50);

        // 3. 设置窗口大小
        frame.setSize(800, 500);

        // 4. 设置窗口可见
        frame.setVisible(true);
    }
}

执行结果 : 执行后会在屏幕的 ( 100, 100 ) 位置显示该窗口 ;
在这里插入图片描述
注意 : 此时窗口无法关闭 , 需要停止程序运行来关闭窗口 ;





六、Panel 示例



Panel 不能独立存在 , 需要依附于 Window 存在 , 因此这里需要先创建 Frame 窗口 , 然后再向其中添加 Panel ;


完整代码示例 :

import java.awt.*;

public class HelloAWT {
    public static void main(String[] args) {
        // 创建窗口
        Frame frame = new Frame("AWT 图形界面编程");

        // 创建 Panel
        Panel panel = new Panel();

        // 创建 文本框
        TextField textField = new TextField("测试文本框");

        // 创建 按钮
        Button button = new Button("测试按钮");

        // 向 Panel 中添加文本框和按钮
        panel.add(textField);
        panel.add(button);

        // 将 Panel 放到 Frame 中
        frame.add(panel);

        // 设置窗口位置
        frame.setLocation(50, 50);

        // 设置窗口大小
        frame.setSize(800, 500);

        // 设置窗口可见
        frame.setVisible(true);
    }
}

执行效果 :
在这里插入图片描述





七、窗口中文乱码处理



在上面的示例中 , 创建的按钮 Button button = new Button("测试按钮"); ,

按钮文本为 " 测试按钮 " , 但是在 窗口中显示时 , 显示的乱码 :

在这里插入图片描述

这是因为 Java 程序代码的编码方式是 UTF-8 格式的编码 ,

而 Windows 系统使用的是 GBK 格式的编码 ;

点击 IntelliJ IDEA 中 执行选项 中的 " Edit Configurations… " 选项 ,

在这里插入图片描述

在 " Run/Debug Configurations " 对话框中 , 点击 " Modify options " 按钮 , 选择 " Add VM options " 选项 ,

在这里插入图片描述

此时界面中会增加一个 VM options 输入框 ,
在这里插入图片描述
在上述 VM options 输入框中 , 输入

-Dfile.encoding=gbk

内容 ,
在这里插入图片描述
应用上述选项 ;

再次执行程序 , 此时界面按钮文本显示正常 ;

在这里插入图片描述





八、ScrollPane 可滚动容器示例



ScrollPane 可滚动容器 无法在 屏幕中独立存在 , 必须 依赖于 Frame 窗口而存在 ;

如果要 显示 ScrollPane 可滚动容器 , 需要 将其添加到 Frame 窗口中 才能显示出来 ;


代码示例 :

import java.awt.*;

public class HelloAWT {
    public static void main(String[] args) {
        // 创建窗口
        Frame frame = new Frame("AWT 图形界面编程");

        // 创建 ScrollPan 容器实例对象
        // 默认情况下 ScrollPan 容器 只有在显示不下的时候才显示滚动条
        // 如果在构造函数中设置了 ScrollPane.SCROLLBARS_ALWAYS 参数, 则总是显示滚动条
        ScrollPane scrollPane = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);

        // 向 ScrollPan 容器中添加 Component 组件
        scrollPane.add(new TextField("测试文本"));
        scrollPane.add(new Button("测试按钮"));

        // 将 ScrollPan 添加到 Frame 窗口中
        frame.add(scrollPane);


        // 设置窗口位置和大小
        frame.setBounds(50, 50, 800, 500);

        // 设置窗口可见
        frame.setVisible(true);
    }
}

执行结果 : 执行后发现 , 只显示 按钮组件 , 文本组件被覆盖在了按钮组件后面 , 这与布局管理器有关 ;

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/163740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线程安全问题(3)

线程不安全:在多线程的调度情况下,导致出现了一些随机性,随机性是代码中出现了一些BUG,导致我们的线程是不安全的 造成线程不安全的原因: 1)操作系统抢占式执行,线程调度随机,这是万恶之源,我们无能为力 2)…

Web进阶:Day7 响应式、BootStrap、实战演练

Web进阶:Day7 Date: January 10, 2023 Summary: 响应式、BootStrap、实战演练 响应式 媒体查询 目标:能够根据设备宽度的变化,设置差异化样式 媒体特性常用写法 媒体特性常用写法: max-width(从小到大&#xff0…

transformers包介绍——nlp界最顶级的包——可以不用 但不能不知道——python包推荐系列

背景1 现在在AI行业,什么最火?计算机视觉还是自然语言处理?其实不得不说,现在nlp很火。还有人记得上个月很多科技爱好者都在玩的chatgpt么?那个就是nlp技术的一大应用。现在都在觉得AI赚钱,工资高&#xf…

深度学习 12 正则化

1. 对于高方差(过拟合),有以下几种方式: 获取更多的数据,使得训练能够包含所有可能出现的情况 正则化(Regularization) 寻找更合适的网络结构 2. 对于高偏差(欠拟合),有以下几种方式: 扩大网…

【C语言进阶】只看此篇,让你学会动态内存管理

目录 前言 一、为什么存在动态内存分配 二、动态内存函数的介绍 1 、malloc和free 2、 calloc 3 、realloc 三、常见的动态内存错误 四、动态内存管理笔试题 1 题目1: 2 题目2: 3 题目3: 4 题目4: 五、C/C程序的…

5.10回溯法--圆排列问题--排列树

圆排列问题描述 给定n个大小不相等的圆,要将这n个大小不相等的圆排进一个矩形框中,且要求个个圆都与矩形框的最底边相切。要找出最小长度的圆排列。 问题分析 排列排列,解空间是一个排列树。 设开始时,a[n]储存n个圆的半径&…

笔试强训48天——day26

文章目录一. 单选1.在单处理器系统中,如果同时存在有12个进程,则处于就绪队列中的进程数量最多为()2.在系统内存中设置磁盘缓冲区的主要目的是()3.下列选项中,会导致进程从执行态变为就绪态的事…

时间复杂度空间复杂度

算法效率数据结构算法时间复杂度大O的渐进表示法三种时间复杂度几道例题一.简单递归二结合代码来判断时间复杂度空间复杂度我们程序猿开始的时候肯定听了不少的:数据结构和算法,那么阿涛就给大家说说自己的拙见吧.数据结构 数据结构就是我们用来组织数据的方式,比如我们可以把…

JVM-【面试题】-垃圾收集算法+垃圾收集器,以后就不用担心对象那些事了

一、垃圾收集算法在jvm里对可回收的对象在不同的垃圾收集器里,有不同的回收算法,具体的可以分为这四种:分代收集算法、复制算法、标记清除算法、标记整理算法1.1 分代收集算法当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有…

【NI Multisim 14.0操作实例——最小锁存器电路】

目录 序言 🔥1.设置工作环境 🔥2.设置原理图图纸 🔥 3.设置图纸的标题栏 🔥 4. 增加元器件 🔥 5. 放置总线 🔥 6. 添加总线分支 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路…

ELasticSearch监控之Cerebro安装

文章目录安装包下载安装使用点击nodes 查看各节点状态点击rest发送可以发送请求查询数据安装包下载 https://github.com/lmenezes/cerebro/releases/download/v0.9.4/cerebro-0.9.4.tgzgit地址:https://github.com/lmenezes/cerebro 安装 将要包移动到/opt目录解…

Unity 3D 导入三维模型||Unity 3D 动画系统简介(Mecanim)

将三维模型导入 Unity 3D 是游戏开发的第一步。 下面以 3ds Max 为例,演示从三维建模软件中将模型导入 Unity 3D 的过程,具体步骤如下。 在 3ds Max 中创建房子模型。执行 Export → Export 命令导出 fbx 模型。设置保存路径以及文件名。选择默认设置选…

【transformers】tokenizer用法(encode、encode_plus、batch_encode_plus等等)

tranformers中的模型在使用之前需要进行分词和编码,每个模型都会自带分词器(tokenizer),熟悉分词器的使用将会提高模型构建的效率。 string tokens ids 三者转换 string → tokens tokenize(text: str, **kwargs)tokens → strin…

安卓车机系统adb shell cmd 源码原理分析

hi,粉丝朋友们大家好! 上一次视频分享了input专题课中input命令在android 12的更新,因为原来课程是基于android 10 (可以加我扣:2102309716 优惠购买) https://ke.qq.com/course/package/77595?tuin7d4eb3…

联合证券|金融部门开年推出新方案 改善优质房企资产负债状况

当时,努力促进房地产与金融正常循环是金融部门的工作要点之一。记者日前了解到,为遵循落实中心经济工作会议布置,有用防范化解优质头部房企危险,改进财物负债情况,有关部门起草了《改进优质房企财物负债表计划举动计划…

【计算机体系结构基础】流水线异常处理和提高流水线效率的技术(一)

流水线中的异常 异常的来源 外部事件指令执行中的错误数据完整性的问题地址转换异常系统调用陷入需要软件修正的运算 异常可以分为:可恢复异常和不可恢复异常 不可恢复异常:系统硬件出现严重故障,异常处理后系统面临重启。 解决办法&#x…

Spring Boot Apollo监听namespace并更新配置Bean(附源码)

这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党 背景 如果我们使用的配置中心是apollo的话我们经常会遇到这样的问题,就是动态更新配置Bean 动态更新配置bean 动态更新配置bean其实是很简单的&…

Python学习笔记-PyQt6消息窗

对话框是界面编程中重要的窗体,一般用于提示或者一些其他特定操作。一、使用QDialog显示通用消息框直接使用QDialog类,可以及通过对话框进行通用对话框显示,亦可以通过自定义设置自己需要的对话框。# _*_ coding:utf-8 _*_import sysfrom PyQ…

MySQL主从复制的原理是什么?

主从复制是指将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。 MySQL支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主…

Python批量下载某网站贵得要shi文档 并保存为PDF

人生苦短,我用Python 基本开发环境💨 Python 3.6Pycharm 相关模块的使用💨 import requests import parsel import re import os import pdfkit需要使用到一个软件 wkhtmltopdf 这个软件的作用就是把html文件转成PDF 想要把文档内容保存…