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开发笔记(序)章节目录》