前面介绍的所有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窗口的更多相关文章

  1. Java开发笔记(九十七)利用Runnable启动线程

    前面介绍了线程的基本用法,按理说足够一般的场合使用了,只是每次开辟新线程,都得单独定义专门的线程类,着实开销不小.注意到新线程内部真正需要开发者重写的仅有run方法,其实就是一段代码块,分线程启动之后 ...

  2. Java开发笔记(八十七)随机访问文件的读写

    前面介绍了字符流读写文件的两种方式,包括文件字符流和缓存字符流,但是它们的写操作都存在一个问题:不管是write方法还是append方法,都只能从文件开头写入,而不能追加到文件末尾或者在文件中间某个位 ...

  3. Java开发笔记(二十七)数值包装类型

    方法的出现缘起优化代码结构,但它的意义并不局限于此,正因为有了方法定义,编程语言才更像一门能解决实际问题的工具,而不仅仅是只能用于加减乘除的计算器.在数学的发展过程中,为了表示四则运算,人们创造了加减 ...

  4. Java开发笔记(三十七)利用正则串分割字符串

    前面介绍了处理字符串的常用方法,还有一种分割字符串的场景也很常见,也就是按照某个规则将字符串切割为若干子串.分割规则通常是指定某个分隔符,根据字符串内部的分隔符将字符串进行分割,例如逗号.空格等等都可 ...

  5. Java开发笔记(四十七)关键字this的用法

    前面介绍了类的基本定义,包括成员属性.成员方法.构造方法几个组成要素,可谓是具备了类的完整封装形态.不过在进行下一阶段的学习之前,有必要梳理一下前述的类定义代码,看看是否存在哪些需要优化的地方.首先观 ...

  6. Java开发笔记(五十七)因抽象方法而产生的抽象类

    前面介绍了类的常见用法,令人感叹面向对象的强大,几乎日常生活中的所有事物,都可以抽象成Java的基类及其子类.然而抽象操作也有副作用,就是某个抽象而来的行为可能是不确定的,比如半夜鸡叫,如果是公鸡则必 ...

  7. Java开发笔记(六十七)清单:ArrayList和LinkedList

    前面介绍了集合与映射两类容器,它们的共同特点是每个元素都是唯一的,并且采用二叉树方式的类型还自带有序性.然而这两个特点也存在弊端:其一,为啥内部元素必须是唯一的呢?像手机店卖出了两部Mate20,虽然 ...

  8. Java开发笔记(七十七)使用Optional规避空指针异常

    前面在介绍清单用法的时候,讲到了既能使用for循环遍历清单,也能通过stream流式加工清单.譬如从一个苹果清单中挑选出红苹果清单,采取for循环和流式处理都可以实现.下面是通过for循环挑出红苹果清 ...

  9. Java开发笔记(序)章节目录

    现将本博客的Java学习文章整理成以下笔记目录,方便查阅. 第一章 初识JavaJava开发笔记(一)第一个Java程序Java开发笔记(二)Java工程的帝国区划Java开发笔记(三)Java帝国的 ...

随机推荐

  1. 做勇敢女孩 https://www.bilibili.com/video/av14346123?from=search&seid=14078047355739050009

    So a few years ago, I did something really brave, or some would say really stupid. I ran for congres ...

  2. LeetCode 818. Race Car

    原题链接在这里:https://leetcode.com/problems/race-car/ 题目: Your car starts at position 0 and speed +1 on an ...

  3. 【转载】Visual Studio(VS) F12 查看DLL源代码

    https://www.cnblogs.com/zhaoqingqing/p/6751757.html esharper官网:https://www.jetbrains.com/resharper/ ...

  4. WinDbg常用命令系列---!handle

    !handle 简介 !handle扩展显示有关目标系统中一个或所有进程拥有的一个或多个句柄的信息. 使用形式 用户模式!handle [Handle [UMFlags [TypeName]]] !h ...

  5. 获取页面scroll高度

    记录一下获取 scroll 高度的方法 经实际测试: document.body.scrollTop 在 chrome 下会返回0. 所以 document.documentElement.scrol ...

  6. C#程序发送POST请求数据中+号丢失解决方案

    C#程序把RSA加密后的密码发送到后台总是校验失败,用wireshark抓包检查发现POST发出的密码中的+号都变成了空格.为了正确的发送数据,要用URL转码协议进行转码. 有两个方法进行URL转码 ...

  7. 从浏览器输入url到显示页面的过程 (前端面试题)

    域名DNS解析,解析到真正的IP地址             | 客户端与服务端建立TCP连接,3次握手 | 客户端发送Http请求 | server接收到http请求,处理,并返回 | 客户端接收到 ...

  8. Linux进阶之Shell编程

    1.什么是Shell Shell是一个命名行解释器,它为用户提供一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动.挂起.停止甚至是编写一些程序. 2.Shell脚本 ...

  9. Shiro安全框架-简介

    1. 简介 Apache Shiro是Java的一个安全框架.功能强大,使用简单的Java安全框架,它为开发人员提供一个直观而全面的认证,授权,加密及会话管理的解决方案. 实际上,Shiro的主要功能 ...

  10. EXCEL复制可见单元格

    Excel筛选后,复制筛选后的单元格 1, 首先还是复制这一部分内容. 2, CTRL+G打开 "定位"窗口. 3, 在 "定位"窗口中选择"定位条件 ...