[笔记] 疯狂JAVA讲义(第3版)第11章 AWT编程

简介: [笔记] 疯狂JAVA讲义(第3版)第11章 AWT编程

第11章 AWT编程


AWT(Abstract Window Toolkit),它是Sun最早提供的GUI库,这个库提供了一些基本功能。


后来又提供了Swing库。


11.1 GUI(图形用户界面)和AWT


@Swing是建立在AWT基础上的,他的事件处理机制使用的是AWT的。


和AWT相关的类放在java.awt包及其子包中,AWT编程有两个基类:Component和MenuComponent。


Component代表一个图形化可与用户交互的对象。例如Button代表一个按钮。


MenuComponent代表菜单组件,包括MenuBar(菜单条)、MenuItem(菜单项)等组件。


此外还有两个重要概念:Container和LayoutManager。


Container是一种特殊的Component,代表一种容器,盛放普通Component。


LayoutManager是容器管理其他组件布局的方式。


11.2 AWT容器


Component提供了几个方法了设置组件大小、性质、可见性。


setLocation(int x,int y)


setSize(int width,int height)


setBounds(int x,int y,int width, int height) //同时设置位置,大小


setVisible(Booean b) 设置可见性


容器(Container)还可以盛放其他组件,容器类提供了如下方法来访问容器内组件:


Component add(Component comp)


Component getComponent(int x,int y)


int getComponentCount()


Component[] getComponents()


AWT主要容器类型:


1、Window ,可独立存在的顶级窗口


2、Panel , 容器,可容纳其他组件,但不能独立存在。必须添加到其他容器中。


Frame是Window的子类,Frame对象有标题,可拖拉改变窗口位置、大小。


初始化为不可见,通过setVisible(true) 使其显示。


默认使用BorderLayout作为布局管理器。


Frame实例:

import java.awt.Frame;
public class FrameTest
{
public static void main(String[] args) {
Frame f = new Frame(“测试窗口”);
f.setBounds(30, 30, 250, 200);
f.setVisible(true);
}
}

上述代码创建一个Frame窗口,但点击x按钮时,无法关闭。因为还没添加事件响应。


Panel是AWT中另一个典型容器,它不能独立存在。外在表现为一个矩形区域,该区域内盛放其他组件。


默认使用FlowLayout作为布局管理器。


import java.awt.*;
public class PanelTest
{
public static void main(String[] args) {
Frame f = new Frame(“测试窗口”);
Panel p = new Panel();
p.add(new TextField(20));
p.add(new Button(“单击”));
f.add§;
f.setBounds(30, 30, 250, 120);
f.setVisible(true);
}
}

ScrollPanel 带滚动条,当组件空间过大,将产生滚动条。


默认使用BorderLayout作为布局管理器。


import java.awt.*;
public class ScrollPaneTest
{
public static void main(String[] args) {
Frame f = new Frame(“测试窗口”);
ScrollPane sp = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);
sp.add(new TextField(20));
sp.add(new Button(“单击我”));
f.add(sp);
f.setBounds(30,30,250,120);
f.setVisible(true);
}
}


将会产生滚动条,但显示出按钮。


11.3 布局管理器


LayoutMAnager根据运行平台调整组件大小。


所有AWT容器都有默认的布局管理器。


为容器设置布局管理器通过调用setLayout(LayoutManage LM)实现


c.setLayout(new XxxLayout());


11.3.1 FlowLayout布局管理器


组件像水流一样流动排列,遇到边界就返回,重头排列。


默认从左到右,遇到边界就来到下一行。


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-int4VcEv-1588248758277)(media/image1.png)]{width=“2.8181813210848645in” height=“0.8350174978127735in”}


11.3.2 BorderLayout布局管理器


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ur5TFAvi-1588248758285)(media/image2.png)]{width=“2.1172134733158354in” height=“1.7979505686789152in”}


BorderLayout将容器分成上面5个区域,


使用BorderLayout添加组件时,需要指定区域,否则默认为CENTER。


如果一个区域放入多个组件,后放的会覆盖先放的。


Frame = new Frame(“test”);


f.setLayout(new BorderLayout());


f.add(new Button(“南”), SOUTH);



f,pack() //设置窗口最佳大小


f.setVisible(true);


@使用Panel容器可以包含多个组件,作为一个整体放入一个区域。


11.3.3 GraidLayouy


网格布局,默认从左到右,从上到下依次添加到每个网格中。


构造器


GridLayout(int rows,int cols);


11.3.4 GridBagLayout


类似GridLayout,但更灵活复杂,需要使用GridBagConstraints对象。


11.3.5 CardLayout布局管理器


类似扑克牌 组件叠在一起。


11.3.6 绝对定位


设置布局管理器为null,添加组件时手动设置组件大小位置,然后在添加。


不推荐使用绝对定位,这可能导致GUI失去跨平台特性。


11.3.7 BoxLayout布局管理器


Swing提供的BoxLayout,保留GridBagLayout的很多优点,却没那么复杂。


构造器:


BoxLayout(Container target,int axis)


创建基于target容器的布局管理器,axis方向有X_AXIS ,Y_AXIS。


常常和Box容器结合使用。


Box是提供两个方法创建Box对象,


createHorizontalBox()


createVerticalBox()


11.4 AWT基本组件


11.4.1 基本组件


Button 按钮


Canvas 画布


Checkbox 复选框


CheckboxGroup


Choice 下拉选择


Frame 窗口


Label 标签


List 列表框组件


Panel


Scrollbar 滑动条


Scrollpane


TextArea 多行文本


TextField 单行文本


11.4.2 对话框(Dialog)


Window类的子类。


对话框通常依赖于其他窗口,


对话框有非模式和模式两种,在模式对话框被关闭前,它的依赖窗口无法获得焦点。


构造器参数:


owner:依赖窗口


title: 标题


modal: 是否是模式的。


Dialog类子类FileDialog,表示文件对话框,用于打开或保存文件。


构造参数:


parent


title


mode: 用于指定打开文件LOAD或保存文件SAVE


11.5 事件处理


11.5.1 Java事件模型的流程


事件处理设计三类对象:


事件源: 事件发生的场所,通常是组件,如按钮、窗口等。


事件 组件上发生的事情。


事件监听器 监听事件源发生的事件,并对事件进行响应处理。


当用户单击一个按钮,这一动作就会触发相应的事件,事件会触发事件源上注册的事件监听器,事件监听器调用相应的方法进行响应。


每个组件均可以针对特定事件指定一个或多个监听对象,每个事件监听器也可以监听一个或多个事件源。


import java.awt.*;
import java.awt.event.*;
public class EventQs
{
private Frame f = new Frame(“测试事件”);
private Button ok = new Button(“确定”);
private TextField tf = new TextField(30);
public void init()
{
//注册事件监听器
ok.addActionListener(new OkListener());
f.add(tf);
f.add(ok,BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}
//定义事件监听器
class OkListener implements ActionListener{
//响应
public void actionPerformed(ActionEvent e){
System.out.println(“用户单击了ok按钮”);
tf.setText(“Hello,world”);
}
}
public static void main(String[] args){
new EventQs().init();
}
}

11.5.2 事件和事件监听器


事件监听器必须实现事件监听接口。


AWT事件分为两大类,低级事件和高级事件。


1.低级事件


指特定动作的事件,如进入、点击、拖放等鼠标动作。


ComponentEvent: 组件事件,组件位置尺寸,可见性发生变化


ContainerEvent: 容器事件 容器添加,删除组件


WindowEvent:窗口事件,窗口状态改变触发


FocusEvent:焦点事件


KeyEvent:键盘事件


MouseEvent:鼠标事件


PaintEvent:组件绘制事件。


2.高级事件(语义事件)


基于语义,可以不和特定的动作相关,而依赖于触发此事件的类。


ActionEvent:动作事件,当按钮,菜单被单击,在TextField中按下Enter键。


AdjustmentEvent:调节事件,在滑动条滑动时触发


ItemEvent:选项事件,用户选择、取消某项时触发


TextEvent:文本事件,文本改变时触发。


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vsLKo9t5-1588248758287)(media/image3.png)]{width=“7.964753937007874in” height=“7.788319116360455in”}


11.5.3事件适配器


事件适配器是监听器接口的空实现,事件适配器实现了监听器接口,并为接口里每个方法都实现了空实现。


当需要创建监听器时,可以通过继承事件适配器,这样就只需要重写自己感兴趣的方法。


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E11OrMdT-1588248758291)(media/image4.png)]{width=“7.426573709536308in” height=“1.495022965879265in”}


11.5.4 使用内部类实现监听器


11.5.5 使用外部类实现监听器


比较少见,因为外部类不能自由访问GUI界面类的组件,编程不简洁。


但如果某个事件监听器确实需要被多个GUI界面共享,而且主要完成某种业务逻辑的实现,则可以考虑外部类实现事件监听器类。


11.5.6 类本身作为事件监听器类


比较简洁但容易产生混乱。


11.5.7 匿名内部类实现监听器


大部分事件监听器只用一次,没有复用价值,所以使用匿名内部类实现会更合适。


import java.awt.*;
import java.awt.event.*;
import java.awt.event.WindowAdapter;
public class AnonymousEventHandler
{
private Frame f = new Frame(“test”);
private TextArea ta = new TextArea(6,40);
public void init()
{
//匿名内部类实现事件监听器
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.out.println(“close window\n”);
System.exit(0);
}
});
f.add(ta);
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
new AnonymousEventHandler().init();
}
}

11.6 AWT菜单


创建菜单与创建组件完全类似。


11.6.1 菜单条、菜单和菜单项


菜单有几个类组合而成:


MenuBar:菜单条,菜单的容器


Menu:菜单组件,菜单项的容器。它也是MenuItem子类,可以做菜单项


PopupMenu:上下文菜单组件(右键菜单组件)

MenuItem 菜单项组件


CheckboxMenuItem: 复选框菜单项组件


MenuShortcut 菜单快捷键


菜单分隔符:将功能相似的菜单分组


1、调用Menu对象的addSeparator()


2、使用添加new MenuItem("-")方式添加菜单分隔线。


11.6.2 右键菜单


11.7 在AWT中绘图


11.7.1 画图的实现原理


在Component类里提供了会绘图相关的3个方法:


paint(Graphics g):绘制组件外观


update(Graphics g) :调用paint方法,刷新组件外观


repaint() :调用update方法,刷新组件外观。


如果程序希望重新绘制组件,则调用该组件的repaint()方法。而paint()或update()方法通常被重写。


11.7.2 使用Graphics类


Graphics可以在组件上绘图。


drawXxxx


fillXxx


drawImage():绘制位图


还提供了两个set方法设置画笔颜色和字体。


AWT提供了一个Canvas类作为绘图的画布,通过创建Canvas子类并重写paint()方法来实现绘图。


可以借助Timer类实现 每隔一段时间就调用组件的repaint()方法, 用来实现动画效果。


Timer(int delay,ActionListener listener):每隔delay毫秒,就触发ActionListener监听器中的时间处理器。


11.8 处理位图


11.8.1 Image抽象类和BufferedImage实现类


BufferedImage提供一个构造器创建对象:


BufferedImage(int width,int height,int ImageType);


还通过了一个getGraphics()方法返回该对象的Graphics对象,从而允许通过该Graphics对象向Image中添加图像。


11.8.2 使用ImageIO 输入、输出位图


read write 静态方法


11.9 剪切板


AWT支持两种剪切板,本地和系统剪切板(用于Java程序和第三方)


11.9.1 数据传递的类和接口


11.9.2 传递文本


11.9.3 使用系统剪切板传递图像


11.9.4 使用本地剪切板传递对象引用


本地剪切板可以保存任何类型的Java对象。


11.9.5 通过系统剪切板传递Java对象


11.10 拖放功能


相关文章
|
1月前
|
Java 数据库连接 API
2025 更新必看:Java 编程基础入门级超级完整版指南
本教程为2025更新版Java编程基础入门指南,涵盖开发环境搭建(SDKMAN!管理JDK、VS Code配置)、Java 17+新特性(文本块、Switch表达式增强、Record类)、面向对象编程(接口默认方法、抽象类与模板方法)、集合框架深度应用(Stream API高级操作、并发集合)、模式匹配与密封类等。还包括学生成绩管理系统实战项目,涉及Maven构建、Lombok简化代码、JDBC数据库操作及JavaFX界面开发。同时提供JUnit测试、日志框架使用技巧及进阶学习资源推荐,助你掌握Java核心技术并迈向高级开发。
154 5
|
2月前
|
JavaScript 前端开发 Java
Java 编程进阶实操中工具集整合组件封装方法与使用指南详解
本文详细介绍Hutool工具集和图书管理系统相关组件的封装方法及使用示例。通过通用工具类封装(如日期格式化、字符串处理、加密等)、数据库操作封装(结合Hutool DbUtil与MyBatis)、前端Vue组件封装(图书列表与借阅表单)以及后端服务层封装(业务逻辑实现与REST API设计),帮助开发者提升代码复用性与可维护性。同时,提供最佳实践建议,如单一职责原则、高内聚低耦合、参数配置化等,助力高效开发。适用于Java编程进阶学习与实际项目应用。
115 10
|
1月前
|
Oracle Java 关系型数据库
java 编程基础入门级超级完整版教程详解
这份文档是针对Java编程入门学习者的超级完整版教程,涵盖了从环境搭建到实际项目应用的全方位内容。首先介绍了Java的基本概念与开发环境配置方法,随后深入讲解了基础语法、控制流程、面向对象编程的核心思想,并配以具体代码示例。接着探讨了常用类库与API的应用,如字符串操作、集合框架及文件处理等。最后通过一个学生成绩管理系统的实例,帮助读者将理论知识应用于实践。此外,还提供了进阶学习建议,引导学员逐步掌握更复杂的Java技术。适合初学者系统性学习Java编程。资源地址:[点击访问](https://pan.quark.cn/s/14fcf913bae6)。
152 2
|
2月前
|
前端开发 Java 数据库连接
Java 编程进阶实操之工具集整合应用指南
本文聚焦Java编程进阶实操,涵盖并发编程、性能优化及数据库操作优化等核心知识点,并结合Hutool、Postman、Git等实用工具,提供从理论到实践的学习路径。通过小型图书管理系统实战项目,详细解析技术选型与实现步骤,助力开发者掌握Spring Boot、MyBatis等框架应用。同时展望Java新特性与技术趋势,为职业发展奠定基础。资源链接:[点此获取](https://pan.quark.cn/s/14fcf913bae6)。
68 1
|
2月前
|
Java 开发者
Java编程实用技巧:提升代码质量与开发效率
Java作为一门成熟且广泛应用的编程语言,掌握一些实用技巧可以显著提高开发效率和代码质量。以下是值得Java开发者掌握的实用技巧:
62 6
|
1月前
|
缓存 安全 算法
2025 年 Java 秋招面试必看 Java 并发编程面试题实操篇
Java并发编程是Java技术栈中非常重要的一部分,也是面试中的高频考点。本文从基础概念、关键机制、工具类、高级技术等多个方面进行了介绍,并提供了丰富的实操示例。希望通过本文的学习,你能够掌握Java并发编程的核心知识,在面试中取得好成绩。同时,在实际工作中,也能够运用这些知识设计和实现高效、稳定的并发系统。
46 0
|
1月前
|
存储 安全 Java
2025 年 Java 秋招面试必看的 Java 并发编程面试题汇总
文章摘要: 本文系统梳理Java并发编程核心知识点,助力2025年秋招面试。内容涵盖:1)基础概念,包括线程/进程区别、创建线程的3种方式(Thread/Runnable/Callable)、6种线程状态及转换;2)关键机制,对比sleep()与wait()的锁行为差异,解释start()而非run()启动线程的原因;3)工具类与典型应用场景。通过技术原理与代码示例结合的方式,帮助开发者深入理解并发模型、线程同步等核心问题,为高并发系统设计打下坚实基础。(150字)
73 0
|
1月前
|
人工智能 Java API
Java并发编程之Future与FutureTask
本文深入解析了Future接口及其实现类FutureTask的原理与使用。Future接口定义了获取任务结果、取消任务及查询任务状态的规范,而FutureTask作为其核心实现类,结合了Runnable与Future的功能。文章通过分析FutureTask的成员变量、状态流转、关键方法(如run、set、get、cancel等)的源码,展示了异步任务的执行与结果处理机制。最后,通过示例代码演示了FutureTask的简单用法,帮助读者更直观地理解其工作原理。适合希望深入了解Java异步编程机制的开发者阅读。
|
2月前
|
网络协议 Java 大数据
【高薪程序员必看】万字长文拆解Java并发编程!(1)
📌 核心痛点暴击:1️⃣ 面了8家都被问synchronized锁升级?一张图看懂偏向锁→重量级锁全过程!2️⃣ 线程池参数不会配?高并发场景下这些参数调优救了项目组命!3️⃣ volatile双重检测单例模式到底安不安全?99%人踩过的内存可见性大坑!💡 独家亮点抢先看:✅ 图解JVM内存模型(JMM)三大特性,看完再也不怕指令重排序✅ 手撕ReentrantLock源码,AQS队列同步器实现原理大揭秘✅ 全网最细线程状态转换图(附6种状态转换触发条件表)
59 0

热门文章

最新文章