11.1 Java9改进的GUI(图形用户界面)和AWT
11.1 Java9改进的GUI(图形用户界面)和AWT
GUI的必要性
前面介绍的所有程序都是基于命令行的,基于命令行的程序可能只有一些“专业”的计算机人士才会使用。例如前面编写的五子棋、梭哈等程序,恐怕只有程序员自己才愿意玩这么“糟糕”的游戏,很少有最终用户愿意对着黑糊糊的命令行界面敲命令。
相反,如果为程序提供直观的图形用户界面(Graphics User Interface
,GUI
),最终用户通过鼠标拖动、单击等动作就可以操作整个应用,整个应用程序就会受欢迎得多(实际上,Windows
之所以广为人知,其最初的吸引力就是来自于它所提供的图形用户界面)。作为一个程序设计者,必须优先考虑用户的感受,一定要让用户感到“爽”,程序才会被需要、被使用,这样的程序才有价值。
AWT
当JDK1.0
发布时,Sun
提供了一套基本的GUI
类库,这个GUI
类库希望可以在所有平台下都能运行,这套基本类库被称为“抽象窗口工具集(Abstract Window Toolkit
)”,它为Java
应用程序提供了基本的图形组件。AWT
是窗口框架,它从不同平台的窗口系统中抽取出共同组件,当程序运行时,将这些组件的创建和动作委托给程序所在的运行平台。简而言之,当使用AWT
编写图形界面应用时,程序仅指定了界面组件的位置和行为,并未提供真正的实现,JVM
调用操作系统本地的图形界面来创建和平台一致的对等体。
使用AWT
创建的图形界面应用和所在的运行平台有相同的界面风格,比如在Windows
操作系统上它就表现出Windows
风格;在UNIX
操作系统上,它就表现出UNIX
风格。Sun
希望采用这种方式来实现“Write Once,Run Anywhere
”的目标。
AWT存在的问题
但在实际应用中,AWT
出现了如下几个问题。
使用AWT
做出的图形用户界面在所有的平台上都显得很丑陋,功能也非常有限。
AWT
为了迎合所有主流操作系统的界面设计,AWT
组件只能使用这些操作系统上图形界面组件的交集,所以不能使用特定操作系统上复杂的图形界面组件,最多只能使用4种字体。
AWT
用的是非常笨拙的、非面向对象的编程模式。
Swing
IFC
1996年,Netscape
公司开发了一套工作方式完全不同的GUI
库,简称为IFC
( Internet Foundation Classes)
,IFC
这套GUI
库的所有图形界面组件,例如文本框、按钮等都是绘制在空白窗口上的,只有窗口本身需要借助于操作系统的窗口实现。
IFC
真正实现了各种平台上的界面一致性。不久,Sun
和Netscape
合作完善了这种方法,并创建了一套新的用户界面库:Swing
。
JFC
AWT
、Swing
、辅助功能API
、2D API
以及拖放API
共同组成了JFC
(Java Foundation Classes
,Java基础类库),其中Swing
组件全面替代了Java1.0
中的AWT
组件,但保留了Java1.1
中的AWT
事件模型。总体上,AWT
是图形用户界面编程的基础,Swing
组件替代了绝大部分AWT
组件,对AWT
图形用户界面编程有极好的补充和加强。
Swing并没有完全替代AWT,而是建立在AWT
基础之上,Swing
仅提供了能力更强大的用户界面组件,即使是完全采用Swing
编写的GUI
程序,也依然需要使用AWT
的事件处理机制。本章主要介绍AWT
组件,这些AWT
组件在Swing
里将有对应的实现,二者用法基本相似,下一章会有更详细的介绍。
Java9后AWT和Swing组件可自适应屏幕
Java9
的AWT
和Swing
组件可以自适应高分辨率屏。在Java9
之前,如果使用高分辨率屏,由于这种屏幕的像素密度可能是传统显示设备的2~3倍(即单位面积里显示像素更多),而AWT
和Swing
组件都是基于屏幕像素计算大小的,因此这些组件在高分辨率屏上比较小。
Java9
对此进行了改进,如果AWT
或Swing
组件在高分辨率屏上显示,那么组件的大小可能会以实际屏幕的2个或3个像素作为“逻辑像素”,这样就可保证AWT
或Swing
组件在高分辨率屏上也具有正常大小。另外,Java9
也支持OSX
设备的视网膜屏。
简而言之,Java9
改进后的AWT
或Swing
组件完全可以在高分辨率屏、视网膜屏上具有正常大小
所有和AWT
编程相关的类都放在java.awt
包以及它的子包中,AWT
编程中有两个基类:Component
和MenuComponent
图11.1显示了AWT
图形组件之间的继承关系
AWT元素分类
在java.awt
包中提供了两种基类表示图形界面元素:Component
和MenuComponent
,其中
Component
代表一个能以图形化方式显示出来,并可与用户交互的对象,例如Button
代表一个按钮,TextField
代表一个文本框等;MenuComponent
则代表图形界面的菜单组件,包括MenuBar
(菜单条)、MenuItem
(菜单项)等子类。
除此之外,AWT
图形用户界面编程里还有两个重要的概念:Container
和LayoutManager
。
Container
是一种特殊的Component
,它代表一种容器,可以盛装普通的Component
;LayoutManager
则是容器管理其他组件布局的方式。