Java开发笔记(一百一十七)AWT窗口
前面介绍的所有Java代码,都只能通过日志观察运行情况,就算编译成class文件,也必须在命令行下面运行,这样的程序无疑只能给开发者做调试用,不能拿给一般人使用。因为普通用户早已习惯在窗口界面上操作,哪里还会跑去命令行自讨苦吃呢?所以Java代码写得再好,也得有个软件界面与用户交互,并将程序的处理结果显示在界面上。众所周知,移动开发的Android平台,采用的便是Java语言,此时Java代码的执行结果可直接显示到手机屏幕。对于电脑来说,Java也提供了桌面程序的图形开发工具,它们主要有三组工具包,分别是源于Java1的AWT、Java2引入的Swing、集成进Java8的JavaFX,每组工具包都自成体系,均能实现图形界面的开发功能。
以最早的AWT为例,它的全称是“Abstract Window Toolkit”,意即抽象窗口工具包。AWT依赖于Java程序所在的操作系统,它的图形函数与宿主系统的图形函数是一一对应的,当Java程序通过AWT绘制图形界面的时候,其实底层仍然调用了操作系统的图形库。当然,由于各种操作系统的图形库不尽相同,某个系统提供的图形函数可能在另一个系统并不存在,因此为了让Java程序兼容不同的操作系统,AWT不得不牺牲部分功能以实现“一次编译,到处运行”的愿景。AWT固然砍掉了一些功能,反而使得它相对纯粹,更适合初学者入门桌面程序开发。
比如要在Window上显示一个窗口界面,利用AWT实现的话只需如下几行代码:
import java.awt.Frame; //演示一个最简单的窗口
public class TestSimple { public static void main(String[] args) {
Frame frame = new Frame(); // 创建一个窗口对象
frame.setVisible(true); // 必须设置为true,否则看不见
}
}
运行以上的测试代码,可在屏幕左上角找到如下图所示的小窗口:

显然这个小窗口非常原始,只有一个Java图标以及最小化、最大化、关闭三个按钮,而且Java图标与最小化按钮还挤到一块了。由此可见,这个原始窗口尚不具备正常软件的基础功能,包括但不限于下列几点:
1、左上角的程序图标右边,应当显示程序名称;
2、除了窗口顶部的三个按钮,还要拥有下方的一块窗口主体界面;
3、窗口启动后的初始位置位于屏幕中央比较合适,方便用户迅速找到它;
上述的几点功能也挺容易实现,只要调用Frame对象的对应方法即可,下面便是Frame类的常用方法说明:
setTitle:设置窗口标题。或者在Frame的构造方法中直接填写标题文字也行。
setSize:设置窗口的宽度和高度。设置之后程序就有了指定宽高的窗口界面。
setLocationRelativeTo:设置窗口的相对位置。当传入的参数值为null时,窗口启动后将显示在屏幕中央。
setResizable:是否允许调整窗口大小。默认允许通过拖动边界来改变窗口大小,该方法设置为false则禁止调整窗口大小。
setBackground:设置窗口的背景色。窗口默认背景为白色。
setVisible:是否允许窗口可见。窗口默认是看不到的,所以必须设置为true才能看到窗口。
接着在代码中补充这些方法调用,完善后的代码例子如下所示:
public class TestFrame {
public static void main(String[] args) {
final Frame frame = new Frame("测试窗口"); // 创建一个窗口对象
frame.setSize(400, 200); // 必须设置宽高,否则没有窗体
//frame.setTitle("222"); // 设置窗口标题,否则窗口无标题
frame.setLocationRelativeTo(null);// 将窗口居中。若无该方法,窗口将位于屏幕左上角
//frame.setResizable(false); // 禁止调整窗口大小。默认允许调整窗口尺寸
frame.setBackground(Color.GREEN); // 设置窗口背景色。默认白色
frame.setVisible(true); // 必须设置为true,否则看不见
}
}
运行上面的完善代码,发现屏幕中央弹出了一块绿油油的程序界面:

哇哦,原来Java开发桌面程序也不难嘛,很容易就鼓捣出了一个有头有脸的窗口。尽管这个窗口界面还很简单,但它毕竟比命令行好看多了,你瞧,按住标题栏可以拖动窗口,单击最小化按钮可以让它缩小至任务栏,单击最大化按钮可以让它扩大到整个屏幕,单击叉号按钮可以……。等等,点了叉号按钮居然没有关闭窗口,这是怎么回事?不应该呀,正常单击叉号按钮都会自动关闭窗口,难道是系统抽风了?AWT之所以没在单击叉号后自动关窗,是因为考虑到此时可能需要额外处理某些事务,例如以下几点场景:
1、要不要弹出温馨提示,避免用户不小心点了叉号?
2、关窗相当于强行杀死程序,那么在程序结束之前,是否先释放占用的资源?
3、单击叉号难道必须叫程序退出运行吗?像360系列软件,单击它的叉号,结果躲到了Window右下角的任务栏小图标,其实并未退出运行,就跟单击了最小化按钮一样。
如此琢磨起来,既然单击叉号还有这么多学问,就得由程序员去接管叉号的单击事件了,AWT只负责监听叉号按钮的单击动作,至于单击之后该让程序做何操作,全凭开发者自由发挥。具体到代码实现,则需调用窗口对象的addWindowListener方法,给该窗口添加事件监听器,一旦接收到窗口关闭动作,就触发监听器的windowClosing方法。那么自定义的关窗代码,即可填入此处的windowClosing方法,下面是点击叉号便自行关窗的补充代码:
frame.addWindowListener(new WindowAdapter() { // 为窗口注册监听器,实现窗口关闭功能
public void windowClosing(WindowEvent e) { // 点击了窗口右上角的叉号按钮
frame.dispose(); // 关闭窗口
}
});
更多Java技术文章参见《Java开发笔记(序)章节目录》
Java开发笔记(一百一十七)AWT窗口的更多相关文章
- Java开发笔记(九十七)利用Runnable启动线程
前面介绍了线程的基本用法,按理说足够一般的场合使用了,只是每次开辟新线程,都得单独定义专门的线程类,着实开销不小.注意到新线程内部真正需要开发者重写的仅有run方法,其实就是一段代码块,分线程启动之后 ...
- Java开发笔记(八十七)随机访问文件的读写
前面介绍了字符流读写文件的两种方式,包括文件字符流和缓存字符流,但是它们的写操作都存在一个问题:不管是write方法还是append方法,都只能从文件开头写入,而不能追加到文件末尾或者在文件中间某个位 ...
- Java开发笔记(二十七)数值包装类型
方法的出现缘起优化代码结构,但它的意义并不局限于此,正因为有了方法定义,编程语言才更像一门能解决实际问题的工具,而不仅仅是只能用于加减乘除的计算器.在数学的发展过程中,为了表示四则运算,人们创造了加减 ...
- Java开发笔记(三十七)利用正则串分割字符串
前面介绍了处理字符串的常用方法,还有一种分割字符串的场景也很常见,也就是按照某个规则将字符串切割为若干子串.分割规则通常是指定某个分隔符,根据字符串内部的分隔符将字符串进行分割,例如逗号.空格等等都可 ...
- Java开发笔记(四十七)关键字this的用法
前面介绍了类的基本定义,包括成员属性.成员方法.构造方法几个组成要素,可谓是具备了类的完整封装形态.不过在进行下一阶段的学习之前,有必要梳理一下前述的类定义代码,看看是否存在哪些需要优化的地方.首先观 ...
- Java开发笔记(五十七)因抽象方法而产生的抽象类
前面介绍了类的常见用法,令人感叹面向对象的强大,几乎日常生活中的所有事物,都可以抽象成Java的基类及其子类.然而抽象操作也有副作用,就是某个抽象而来的行为可能是不确定的,比如半夜鸡叫,如果是公鸡则必 ...
- Java开发笔记(六十七)清单:ArrayList和LinkedList
前面介绍了集合与映射两类容器,它们的共同特点是每个元素都是唯一的,并且采用二叉树方式的类型还自带有序性.然而这两个特点也存在弊端:其一,为啥内部元素必须是唯一的呢?像手机店卖出了两部Mate20,虽然 ...
- Java开发笔记(七十七)使用Optional规避空指针异常
前面在介绍清单用法的时候,讲到了既能使用for循环遍历清单,也能通过stream流式加工清单.譬如从一个苹果清单中挑选出红苹果清单,采取for循环和流式处理都可以实现.下面是通过for循环挑出红苹果清 ...
- Java开发笔记(序)章节目录
现将本博客的Java学习文章整理成以下笔记目录,方便查阅. 第一章 初识JavaJava开发笔记(一)第一个Java程序Java开发笔记(二)Java工程的帝国区划Java开发笔记(三)Java帝国的 ...
随机推荐
- 洛谷 P2746 [USACO5.3]校园网 Network of Schools 题解
Tarjan 模板题 第一问就是缩点之后看有多少个入度为零的点就好了. 第二问是在缩点后将每个点的入度和出度都求出(只要有入度或出度就置为1),然后比较哪个有值的多,将多的作为答案输出.原因是由题可得 ...
- .NET添加新项目-配置不同环境参数
添加新项目-配置不同环境参数 添加新项目后,需要对配置管理器进行设置.默认新加的项目只有debug和release 现加其他环境(dev.uat...)的配置[通过项目文件.csproj来加,拷贝其他 ...
- HTML | CSS | JavaScript 常见错误
持续更新 超链接鼠标悬浮后的状态 a:hover 拼写 图片文件的路径问题
- 梯度裁剪(Clipping Gradient):torch.nn.utils.clip_grad_norm
torch.nn.utils.clip_grad_norm_(parameters, max_norm, norm_type=2) 1.(引用:[深度学习]RNN中梯度消失的解决方案(LSTM) ) ...
- 网站性能测试工具 webbench 的安装和使用-linux
1.webbench的下载和安装 wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz sudo tar xvf we ...
- nacos启动与sql8.0的问题解决方法
hi all! 半年多没更新,是不是以为我消失了……直接正题~ 在搭建nacos环境的时候,有这样的一项:数据库持久化配置.(官方文档),这个配置可以灵活的帮我们进行配置而不用总是重启服务. 那么问题 ...
- 生成一个字母数字组合的n位随机码、随机数、随机字符串
package com.cms.util; /** * 生成一个字母数字组合的n位随机码 * @author abc * */ public class CodeUtil { // private f ...
- CTF RCE(远程代码执行)
目录 php代码执行 一.相关函数 1.代码注入 2.命令执行 二.命令执行的绕过 1.命令执行的分隔符 2.空格代替 3.绕过 4.命令执行的各种符号 三.命令无回显的情况 1.判断 2.利用 四. ...
- Mybatis(下)
Mybatis(下) 一.MaBatis核心配置文件 Mybatis 中文文档 Mybatis 中文文档 1. properties 定义属性及读取属性文件,取的时候用 $(name) ,name 为 ...
- Mybatis(上)
Mybatis 一.MyBatis 简介 1. MyBatis作用 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架. MyBatis 避免了几乎所有的 JDBC 代码和手 ...