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真正实现了各种平台上的界面一致性。不久,SunNetscape合作完善了这种方法,并创建了一套新的用户界面库:Swing

JFC

AWTSwing、辅助功能API2D 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组件可自适应屏幕

Java9AWTSwing组件可以自适应高分辨率屏。在Java9之前,如果使用高分辨率屏,由于这种屏幕的像素密度可能是传统显示设备的2~3倍(即单位面积里显示像素更多),而AWTSwing组件都是基于屏幕像素计算大小的,因此这些组件在高分辨率屏上比较小。
Java9对此进行了改进,如果AWTSwing组件在高分辨率屏上显示,那么组件的大小可能会以实际屏幕的2个或3个像素作为“逻辑像素”,这样就可保证AWTSwing组件在高分辨率屏上也具有正常大小。另外,Java9也支持OSX设备的视网膜屏。
简而言之,Java9改进后的AWTSwing组件完全可以在高分辨率屏、视网膜屏上具有正常大小

所有和AWT编程相关的类都放在java.awt包以及它的子包中,AWT编程中有两个基类:ComponentMenuComponent图11.1显示了AWT图形组件之间的继承关系
这里有一张图片

AWT元素分类

java.awt包中提供了两种基类表示图形界面元素:ComponentMenuComponent,其中

  • Component代表一个能以图形化方式显示出来,并可与用户交互的对象,例如Button代表一个按钮,TextField代表一个文本框等;
  • MenuComponent则代表图形界面的菜单组件,包括MenuBar(菜单条)、MenuItem(菜单项)等子类。

除此之外,AWT图形用户界面编程里还有两个重要的概念:ContainerLayoutManager

  • Container是一种特殊的Component,它代表一种容器,可以盛装普通的Component;
  • LayoutManager则是容器管理其他组件布局的方式。