没有合适的资源?快使用搜索试试~ 我知道了~
Java就业培训教程GUI上.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 104 浏览量
2022-07-14
15:48:31
上传
评论
收藏 456KB PDF 举报
温馨提示
试读
26页
Java就业培训教程GUI上.pdf
资源详情
资源评论
资源推荐
244
第 8 章 GUI (上)
GUI 全称是 Graphical User Interface ,即图形用户界面。顾名思义,就是应用程序提
供给用户操作的图形界面,包括窗口、菜单、按钮、工具栏和其他各种屏幕元素。目前,图
形用户界面已经成为一种趋势, 它的好处自不必多说了, 所以几乎所有的程序设计语言都提
供了 GUI 设计功能。在 Java 里有两个包为 GUI 设计提供丰富的功能,它们是 AWT和 Swing。
AWT是 Java 的早期版本,其中的 AWT组件种类有限,可以提供基本的 GUI 设计工具,却无
法完全实现目前 GUI 设计所需的所有功能。 Swing 是 SUN公司对早期版本的改进版本,它不
仅包括 AWT中具有的所有部件,并且提供了更加丰富的部件和功能,它足以完全实现 GUI
设计所需的一切功能。 Swing 会用到 AWT中的许多知识,掌握了 AWT,也就基本上掌握了
Swing,我们就从 AWT开始我们的图形界面设计之旅吧!
8.1 初识 AWT
AWT中定义了多种类和接口,用于在 Java 应用程序和 Java Applet 中进行 GUI 设计。
我们首先通过下面的示例程序来感受一下 Java 的图形界面编程。
import java.awt.*;
public class TestFrame
{
public static void main(String [] args)
{
Frame f=new Frame( “ IT 人资讯交流网 ”);
f.add(new Button( “ok”));
f.setSize(300,300);
f.setVisible(true);
}
}
图形界面程序中可以使用各种各样的图形界面元素,如文本框,按钮,列表框,对话框
等等,我们将这些图形界面元素称为 GUI 组件。 AWT为各种 GUI 组件提供了对应的 Java 组
件类,这些组件类都是 java.awt.Component 的直接或间接子类。其中, Frame 类用于产生
一个具有标题栏的框架窗口。 Frame.setSize 方法设置窗口的大小, Frame.setVisible 显示
或隐藏窗口,程序运行后产生一个如图 8.1 所示的非常标准的框架窗口。用 AWT编写 Java
的 GUI 程序的图形用户界面的各种组件类都位于 JDK的 java.awt 包中,程序开始必须导入
java.awt 包,可以导入整个 java.awt 包,也可以只导入程序中用到的那些组件类。编译运
行此程序,结果如图 8.1 所示。
245
图 8.1
对于众多的 GUI 组件,根据其作用可以又分为两大类:基本组件(下面就全部简称为
组件)和容器。
组件又被称为构件, 它是诸如按钮、 文本框之类的图形界面元素, 在这些组件上不能容
纳其他的组件。 容器其实也是一种组件, 是一种比较特殊的组件, 它可以用来容纳其他组件,
如窗口,对话框等等,所有的容器类都是 java.awt.Container 的直接或间接子类。
Container 类是 Component 类的一个子类 , 由此可见容器本身也具有组件的功能和特点,也
可以被当作基本组件一样使用。 在上面的程序中, Frame 就是一个容器, 它容纳了一个 Button
部件。
8.2 AWT 线程
细心的读者也许注意到了,在运行上面写的那段程序时,主调用类的 main 方法执行
f.setVisible(true) 语句后就退出了, 程序的 main 线程也随之结束了, 但程序并没有结束,
窗口不仅正常显示在桌面上,而且我们还可以对这些窗口进行一些常规操作,如拖动窗口,
改变窗口的大小等。我们在多线程的课程中曾经讲过,对 Java 程序来说,只要还有一个前
台线程在运行, 整个进程就不会结束。 这说明我们的程序还有其它线程在运行, 那么其它线
程是谁创建的?又是在什么时候创建的呢?读者可以简单地认为,程序在产生 Frame 对象
时,创建了一个新的线程,我们称之为 AWT线程。 AWT线程的内部实现,在不同的 JDK版本
下不太一样,从我们对 Java 的使用经验上来看,在不同的版本下,我们时常碰到我们的应
用程序(不仅仅是 AWT)有不同的执行结果,这是令人很痛苦和无奈的事情,也是我们使用
Java 所要经常承担的风险。如果我们的程序调用 Frame.dispose 方法关闭了我们的框架窗
口(具体实现细节, 读者在本章稍后的部分能够看到) ,当程序放在 JDK1.3 下运行时, 我们
发现 AWT线程没有结束,程序也不会自动结束。但在 JDK1.4 下运行这个程序,当框架窗口
被关闭后, AWT线程也结束了,程序随之结束。
搬出那些过时的小经验来给读者讲解, 并不是什么好主意, 甚至会造成误导。 所以在这
里,我的侧重点并不是要讲解与分析 AWT线程在不同 JDK版本下的差异的具体案例本身, 因
为百分之九十九的读者都不会再用到旧的 JDK版本,也不会再碰到这样的问题的, 既然人家
在新的版本中已经做出了修改, 你就没必要白费精力、 花功夫去了解那些陈年旧事了。 虽然
246
如此, 但我还要在此提及这个问题, 是要告诉大家下面的信息:在实际开发中,要注意到有
时候碰到的一些莫名奇妙的问题, 并不是我们程序本身的问题, 不妨换个角度去想, 可能是
开发工具或系统版本的问题,在通常的应用程序开发中,不要太相信你的系统是绝对的。
从事计算机软件开发,对绝大多数人来说,不是科学研究,而是一个工程项目的实施,
我们使用的开发环境, 开发工具, 甚至编程语言本身就是我们的工程工具, 这些工具不可能
是完全理想和完美的, 经常会有这样或那样的小问题, 往往都是软件开发人员在应用过程中
发现了它们在某个应用上的问题后, 系统供应商再去修改他们的的开发环境, 升级他们的开
发工具,完善编程语言。 在这之前, 我们只能想别的办法来完成我们程序中的有关任务,或
是通过别的手段来回避这些开发工具、 环境、 语言本身的问题。 当新手碰到这些开发工具和
语言本身的问题后, 一般都不知所措, 只会从程序的角度上去找错误, 而不是怀疑开发工具
或程序语言本身的问题。 所以, 在软件开发过程中,老手的经验是非常重要的,脱离实际应
用,只学习编程语言本身的人们,往往都很难独当一面地从事软件开发。
8.3 AWT 事件处理
8.3.1 事件处理机制
我们在上面写的这个程序有一个明显的问题, 鼠标点击窗口标题栏上的关闭按钮并不能
够使窗口关闭和使程序结束,我们只能用操作系统自带的杀死进程的办法来关闭这个程序,
在命令行窗口中用 ctrl+c 就可以强制结束正在运行的程序。其实,这也没有什么奇怪的,
通过 GUI 组件, 用户可以对应用程序进行各种操作, 反之, 应用程序可以通过 GUI 组件收集
用户的操作信息,如用户在窗口上移动了鼠标、按下了键盘等。别忘了 GUI 的意义,是应用
程序提供给用户操作的图形界面,而 GUI 本身并不对用户操作的结果负责。大家可以想想,
我们在这个窗口上添加了一个按钮, 当用户用鼠标点击这个按钮时, 程序不也是什么都不做
吗?如果我们想对鼠标点击按钮这个事件执行某种功能,就必须编写相应的处理程序代码。
对于这种 GUI 程序与用户操作的交互功能, Java 使用了一种自己专门的方式,称之为
事件处理机制。在事件处理机制中,我们需要理解三个重要的概念:
事件:用户对组件的一个操作,我们称之为一个事件。
事件源:发生事件的组件就是事件源。
事件处理器:负责处理事件的方法。
三者之间的关系如图 8.2 所示:
图 8.2
Java 程序对事件进行处理的方法是放在一个类对象中的, 这个类对象就是事件监听器。
我们必须将一个事件监听器对象同某个事件源的某种事件进行关联, 这样,当某个事件
源上发生了某种事件后, 关联的事件监听器对象中的有关代码才会被执行。 我们把这个关联
的过程称为向事件源注册事件监听器对象。 从上面的图例中, 我们能够看到, 事件处理器 (事
247
件监听器)首先与组件(事件源)建立关联,当组件接受外部作用(事件)时,组件就会产
生一个相应的事件对象, 并把此对象传给与之关联的事件处理器, 事件处理器就会被启动并
执行相关的代码来处理该事件。
基本上明白了 Java 的事件处理机制 , 我们接着详细介绍事件和事件监听器的一些编程
方面的有关知识。
事件用以描述发生了什么事情。 AWT对各种不同的事件,按事件的动作(如鼠标操作) 、
效果(如窗口的关闭和激活)等进行了分类, 一类事件对应一个 AWT事件类。我们这里并不
想象通常的书籍一样, 给大家罗列各种各样的事件并解释一番。 我在这里为大家简要介绍几
个具有典型代表意义的事件, 就足以让大家掌握相关的知识了, 如果有人想了解所有的事件,
不用去查找什么大全之类的书籍, 在这里我告诉你一个简单的办法, 你只要参阅 JDK文档中
的 java.awt.event 包,那里列出了所有的事件类。
MouseEvent 类对应鼠标事件,包括鼠标按下,鼠标释放,鼠标点击(按下后释放)
等。
WindowEvent 类对应窗口事件,包括用户点击了关闭按钮,窗口得到与失去焦点,
窗口被最小化等。
ActionEvent 类对应一个动作事件,它不是代表一个具体的动作,而是一种语义,
如按钮或菜单被鼠标单击, 单行文本框中按下回车键等都可以看作是 ActionEvent
事件。读者可以这么理解 ActionEvent 事件,如果用户的一个动作导致了某个组件
本身最基本的作用发生了, 这就是 ActionEvent 事件。 菜单、 按钮放在那就是用来
发出某种动作或命令的, 鼠标单击(也可以用键盘来操作)这些组件, 只是表示要
执行这种动作或命令的事情发生了, 显然对于这种情况, 我们并不关心是鼠标单击,
还是键盘按下的。
通过各种事件类提供的方法, 我们可以获得事件源对象, 以及程序中对这一事件可能要
了解的一些特殊信息,如对于鼠标事件,我们很可能要获得鼠标的坐标信息,经过查 JDK
文档就能知道用 MouseEvent.getX ,MouseEvent.getY 这两个方法。小时候常听人讲“人有
多大胆,地有多大产” ,同样,对于我们编程中遇到的一般正常的需求,开发工具包都会提
供,没有解决不了的, 只有我们还没找到的。 解决问题的关键就看我们有没有现用现找的本
领了。
某一类事件, 其中又包含触发这一事件的若干具体情况。 对一类事件的处理由一个事件
监听器对象来完成, 对于触发这一事件的每一种情况, 都对应着事件监听器对象中的一个不
同的方法。 某种事件监听器对象中的每个方法名称必须是固定的, 事件源才能依据事件的具
体发生情况找到事件监听器对象中对应的方法, 事件监听器对象也包含事件源可能调用到的
所有事件处理方法。 这正是 “调用者和被调用者必须共同遵守某一限定, 调用者按照这个限
定进行方法调用,被调用者按照这个限定进行方法实现 ”的应用规则,在面向对象的编程
语言中, 这种限定就是通过接口类来表示的。 事件源和事件监听器对象就是通过事件监听器
接口进行约定的, 事件监听器对象就是实现了事件监听器接口的类对象。 不同的事件类型对
应不同的事件监听器接口。
事件监听器接口的名称与事件的名称是相对应的,非常容易记忆,如 MouseEvent 的监
听 器 接 口 名 为 MouseListener , WindowEvent 的 监 听 器 接 口 名 为 WindowListener ,
ActionEvent 的监听器接口名为 ActionListener 。
有许多书上将众多的事件分为两大类:低级事件和语义事件(又叫高级事件) ,并列出
了所有属于低级事件的事件, 所有属于高级事件的事件。 凭作者的经验, 不相信真有读者能
够很清楚的记住哪些是高级事件和哪些是低级事件, 包括那些书的作者们本人也做不到。 虽
然作者认为, 记住哪些是高级事件和哪些是低级事件毫无意义, 但作者也可以让你不用记忆,
248
就能够轻松地进行这种区分。 如果某个事件的监听器接口中只有一个方法, 那么这个事件就
是语义事件,如 ActionListener 中只有一个方法, ActionEvent 就是一种语义事件,反之,
则为低级事件。 另外,从字面上,我们也能够想象,语义事件关心的是一个具有特殊作用的
GUI 组件对应的动作发生了,而不关心这个动作是怎样发生的。
8.3.2 用事件监听器处理事件
我们来看看如何为上面的程序添加窗口关闭的代码,从而学习事件处理的具体编码实
现:
程序清单: TestFrame.java
import java.awt.*;
import java.awt.event.*;
public class TestFrame
{
public static void main(String [] args)
{
Frame f=new Frame( “ IT 人资讯交流网 ”);
f.setSize(300,300);
f.setVisible(true);
f.addWindowListener(new MyWindowListener());
}
}
class MyWindowListener implements WindowListener
{
public void windowClosing(WindowEvent e)
{
e.getWindow().setVisible(false);
((Window)e.getComponent()).dispose();
System.exit(0);
}
public void windowActivated(WindowEvent e){}
public void windowClosed(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}
public void windowDeiconified(WindowEvent e){}
public void windowIconified(WindowEvent e){}
public void windowOpened(WindowEvent e){}
}
在上面的程序代码中,由于 AWT中的事件类和监听器接口类都位于 java.awt.event 包
中,所以在程序的开始处, import 了 java.awt.event.* 。注意, import 一个包中的所有类,
并没有 import 该包的子包中的类,所以,我们 import 了 java.awt 包,还要单独 import
java.awt.event 包,其实,这个问题,即使我们不讲,大家也应该能够自己通过实验弄明
白的。 只要勇于实践,多动手编写些程序,通过观察编译运行的结果, 就可以验证我们的许
多想法或去除心中的疑惑,同时也锻炼和逐渐提高了我们的编程能力。
我们编写了一个新类 MyWindowListener 来实现窗口事件监听器对象的程序代码,并调
用 Window.addWindowListener 方法将事件监听器对象注册到 Frame 类( Frame 类继承
剩余25页未读,继续阅读
yyc13139216118
- 粉丝: 2
- 资源: 6万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 简单的Python示例,演示了如何使用TCP/IP协议进行基本的客户端和服务器通信
- 考试.sql
- keil2 + proteus + 8051.exe
- 1961ee27df03bd4595d28e24b00dde4e_744c805f7e4fb4d40fa3f695bfbab035_8(1).c
- mediapipe-0.9.0.1-cp37-cp37m-win-amd64.whl.zip
- windows注册表编辑工具
- mediapipe-0.9.0.1-cp37-cp37m-win-amd64.whl.zip
- 校园通行码预约管理系统20240522075502
- 车类型数据集6250张VOC+YOLO格式.zip
- The PyTorch implementation of STGCN.STGCN-main.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0