Java编程入门(1.6):现代用户界面
计算机刚问世时,普通人——包括大多数程序员——都不允许靠近计算机。计算机被锁在有值班员看守的房间里,这些人穿着白色工作服,负责把你的程序和数据输入电脑里,一段时间后就会返回计算机的运行结果。20世纪60年代发明了分时系统——计算机能够快速地把运行的工作从一个用户切换到另外一个用户的系统,这使多个用户同时直接与计算机交互成为可能。在分时系统里,多个用户坐在“终端”旁输入命令到计算机里,计算机就会打印出它的响应信息。之前的个人计算机同样使用输入命令和打印出响应的方式,不同之处是只能同时存在一个用户。用户与电脑的这种交互方式叫作命令行界面操作。
当然,现在的大多数人都在使用完全不同的方式与计算机进行交互。他们使用图形用户界面,简称GUI。计算机在屏幕上绘制界面组件。这些组件包括窗口、滚动条、菜单、按钮和图标等。通常来说,我们使用鼠标来操作这些组件,或者在触控屏上用手指来操作。只要你不是刚从二十世纪七十年代穿越而来的,你肯定已经很熟悉图形用户界面的基础了。
大部分的GUI交互组件都已经相当标准化了。也就是说,它们拥有相似的外观并且能在包括Mac OS、Windows和Linux这些不同的计算机平台上运行。Java能够使用所有的这些GUI组件,而且它的目标是让这些组件在不用修改程序的前提下能够在不同的平台上运行。这些组件的外观在不同的平台上可能会有点不同,但是程序在任意计算机上提供的功能应该是一样的。
下面的图片中,一个简单的Java程序演示了一些GUI界面组件。当程序运行时,计算机屏幕上就会显示出一个与下图类似的窗体。在这个窗体里有四个可以和用户交互的组件:按钮、复选框、文本域和弹出菜单。这些组件都被标签标明了。这个窗体里还有一些其他的组件。标签本身就是一个组件(即使你不能与它进行交互)。窗体的右半部是一个文本域组件,它可以显示多行文本。当文本的行数大于刚好填充满文本域的行数时,滚动条组件就会出现在文本域的一边。实际上,在Java中,这整个窗体本身就被认为是一个“组件”。
(如果你想要运行这个程序,你可以在网上获取GUIDemo.java源码和已编译的程序GUIDemo.jar,这本书更多其他示例及使用说明可以参考2.6节。)
如今,Java实际上拥有两个完整的GUI组件集合。其中一个是AWT或者叫抽象窗体工具集(Abstract Windowing Toolkit),Java的原始版本就提供了这个工具集。另外一个叫作Swing,它是在Java 1.2时发布的。并且在大多数的现代Java编程中都优先使用Swing。上面演示的程序就使用了Swing的部分组件。
当用户使用GUI组件进行交互时,“事件”的概念就产生了。例如,点击一下按钮就会产生一个事件,在文本域打字时按回车会产生事件。每次产生事件都会向程序发生一条消息,告诉它发送了什么事件,然后程序就根据它的编码去响应事件。事实上,一个典型的GUI程序由大量的“事件处理器”组成,它们负责告诉程序如何去响应各种类型的事件。在这个例子中,该程序被编程为通过在文本域里打印信息来响应每一个事件。在更实际的例子中,事件处理器可以做更多的事。
这里使用“消息(message)”术语是有意图的。就像你在上一节里所看到的,消息会被发送给对象。实际上,Java GUI组件都是一些对象。Java包括了很多预定义类,这些类代表了各种类型的GUI组件。其中的一些类又是其他类的子类。这里有一张图仅展示了一些Swing的GUI类和它们的关系:
现在不用担心它们的细节,但要去感受下在这里是如何使用面向对象编程和继承的。注意,所有的GUI类都直接或者间接地属于JComponent类的子类,这个类包含了所有Swing组件共享的常规属性。在上图中,有两个JComponent的直接子类本身就拥有自己的子类。JTextArea和JTextField类都拥有一些相同的行为,并一起被分组到JTextComponent的子类下。类似地,JButton和JToggleButton都是JAbstractButton的子类,它们都包含了按钮和复选框这些共有的属性。(顺便说一下,JComboBox是一个包含弹出菜单的Swing类。)
仅从这个简单的论述中,你或许可以看到GUI编程是怎样有效地利用面向对象设计的。实际上,拥有“可视化对象”的GUI可能是推进OOP流行的主要因素。
使用GUI组件和事件编程是Java最有趣的一个方面。但是,我们会先使用几个章节来介绍基础知识,并在第6章重返这个话题。