Más contenido relacionado La actualidad más candente (12) Similar a Java Web动态图表编程 (20) Java Web动态图表编程1. 本书向读者展示如何使用 Java Applet、Java Servlet、Java Server Pages(JSP)、JavaBean
以及开放源代码的 Web 图表生成引擎——JFreeChart 和 Cewolf 来开发奇妙的 Web 动态图表
应用程序——以一种跨平台、小巧、结构清晰的模式在 Web 上生成动态图表。
随着计算机网络及编程技术的发展,使得越来越多的应用程序被移植成以 Web 应用程序
(浏览器/服务器)的方式,工作在因特网/局域网环境之中。网络开发人员发现,某些传统
IDE 开发环境,例如:在 Dephi 和 VB 中可以轻而易举地实现的图形界面,而在 Web 程序中却
很难实现,其中一个典型的例子就是 Web 图表(Chart)的生成与处理。即使 Web 程序(ASP、
ASP.NET 等)能够处理一些图表,也基本是采用 ActiveX 或者 COM 组件的结构。这种方法有
三大弊端:
? 开发 ASP 比较简单,但开发 ActiveX 和 COM 却很难;
? 基于 ActiveX 和 COM 构架的 Web 应用程序只能用于微软 Windows 的 Web 服务器 IIS 环境下,
移植性差;
? 由于 ActiveX 和 COM 与 Windows 深度紧密结合,在带来强大功能的同时,也一并带来了
Windows 固有的缺陷——安全性和稳定性差。
PHP 可以用于 Web 图表处理,它具有跨平台、安全性能高、兼容性及扩展性强的优点,但也
有其固有的缺陷,具体表现为以下几点:
? 效率不高,基于解释型,而非编译型,这一点与 ASP 类似。ASP.NET 吸取了 JSP 的优点,
属于编译型,大大提高了运行速度和效率;
? 安装复杂,每一种扩展模块不完全是由 PHP 自身来完成。当图形需要 GD 库,使用类似的扩
展库时,安装和调试是 PHP 的一大问题;
? 因为是开发源代码产品,所以缺乏企业级的商业支持。
JSP 的出现,使得上述弊端不复存在。随着 Java 对二维图形及三维图像的处理能力越来
越强大,利用 JSP 来简单、高效地开发一个 Web 图表应用程序已经不是一件难事了。为了展
示如何编写 Web 图表应用程序,本书中,我们不仅提供了多个 JSP 图表生成的实例,而且还
将从以下两个方面加以说明 Web 图表编程是如何实现的。
1.利用 Java 自身对图形的处理能力,由开发者编写代码来生成 Web 动态图表。将以大量的
例程,不同的方式(例如:Java Applet、Java Servlet、JSP、JavaBean) ,从不同的角度来
展示如何编写 Web 图表的 Java 程序。
2. 借助第三方的图表生成引擎来完成图表, 主要利用一些 Java 开放源代码组织开发的作品,
例如:
? 由 www.jfree.org 推出的 JFreeChart;
? 由 cewolf.sourceforge.net 推出的 Cewolf。
Cewolf 是基于 JFreeChart 的二次开发。 实质上,是基于 JFreeChart 的应用。JFreeChart
没有免费提供开发文档,只有英文版的相关资料,因此 JFreeChart 和 Cewolf 在国内的应用
受到了一定的限制。
根据我们使用及研究 JFreeChart 和 Cewolf 的经验,将在本书中提供大量的例程和详尽
的讲解,帮助读者轻松地掌握上述两种非常优秀的、基于 Java 的 Web 图表生成引擎。相信阅
读本书,并加以必要的练习,读者将会发现,基于 JSP 的 Web 图表编程是可以轻松完成的。
本书结构及内容
本书例程丰富、代码简洁、结构清晰、讲解准确、图文并茂。共分九章,各章具体内容
如下:
第 1 章 Java 概述
本章主要概述 Java 历史及其发展、Java 开发环境的建立,以及编写一个简单的 Java 应
用程序。
2. 第 2 章 Java Applet 与绘图基础
本章简要介绍 Applet 绘图基础,例如:图形环境、图形对象、基本的字体及颜色控制,
以及如何使用 Applet 绘制一些基本的几何图形。通过本章的学习,读者将掌握基本的 Java
图像编程方法。
第 3 章 Java Applet 图表绘制实例
本章综合利用绘制基本几何图形的方法来开发以下常见的图表:
? ·垂直柱状图
? ·饼图
探讨如何以图表的方式生成以下内容:
? ·在 Web 动态图表中加载外部图像文件
? ·支票
? ·如何从 HTML 文档中获取参数生成动态图表
通过本章的学习,读者将会理解任何复杂的图表都可以分解成一些基本的几何图形;通
过排列组合不同的外部图像文件,以及基本的几何图形,就可以生成复杂的图表。
第 4 章 JSP/Servlet 运行环境的搭建
本章主要介绍 JSP Web 服务器的安装。在运行 JSP/Servlet 之前,首先需要安装 JSP/
Servlet 的运行环境,它就是我们平常所说的,支持 JSP/Servlet 的 Web 服务器(容器) 。
目前有很多支持 JSP/Servlet 的 Web 服务器,我们先介绍两种免费的、高性能的、适合
中小企业 JSP/Servlet 的 Web 服务器——Tomcat 和 Resin,并将详细阐述 Tomcat 实现
JSP/Servlet 的运行机制。此外,介绍一种企业级的 J2EE 服务器——Weblogic,学习如何在
这些服务器中部署及发布基于 JSP/Servlet 的 Web 图表应用程序。
第 5 章 基于 Servlet 的 Web 图表编程
本章讲述 Web 请求/响应机制(get 和 post) 、如何部署 Servlet、如何利用 Servlet 生
成 Web 动态图表, 并且提供了模拟网站投票统计、 生成登录验证码、 普通/3D 甘特图等 Servlet
实例。
第 6 章 JSP Web 图表编程基础
本章讲述 JSP 绘图基础。 JSP 的环境下,
在 如何使用 Java.awt.Graphics 类的各种方法,
包括绘制直线、文本(字符串) 、矩形、椭圆和圆、圆弧、多边形、折线,以及如何加载外部
图像文件,等等。
在绘制基本几何图形的基础上,我们将以圆柱体和立方体为例,展示如何通过绘制多个多边
形并将其组合成复杂几何图形的方法;利用 Java.imageio 包中 ImageIO 类的支持,调用
ImageIO 来执行诸如加载图像,以及对图像进行编码输出等工作。
第 7 章 JSP 与 Java2D Web 图表编程
本章阐述如何利用 Java2D API 对于高级二维图形的处理能力,例如:笔划属性的设 定、
图形填充、渐变色、图像的透明度、字体处理、图形边缘的反锯齿、图形对象的转换以及变
形,等等,利用 B/S 应用程序中生成 Web 图表的方法,并以二维及三维图表的形式,包括折
线图、水平直方图、垂直柱状图、堆栈图、饼图,以及二次曲线来进行讲解和说明。
提供了一个绘制复杂图表的例程——股市大盘指数走势图。通过本章的学习,读者可以
不借助任何第三方的程序,编写生成各种风格、复杂的 Web 图表应用程序。
第 8 章 开放源代码与 Web 图表编程
本章详细讲述了 JFreeChart 和 Cewolf 这两个 Web 图表生成引擎的安装、配置及使用方
法。提供了在 JFreeChart 和 Cewolf 的环境下生成以下类型图表的完整例程及讲解:
? 普通/3D 水平及垂直直方图、普通/3D 饼图、普通/3D 堆栈图
? 线段(曲线)图、区域图、时序图、蜡烛图、移动平均线图
3. ? 罗盘图、温度计图、速度表图、信号图
? 甘特图、多轴图表、组合图表
此外,还包括如何在 Cewolf 的环境中,创建自定义绘制属性的图表。
第 9 章 Web 图表生成引擎的设计思路与实现
本章讨论如何开发一个图表生成引擎; 如何设计图表生成引擎 (封装成 JavaBean 的形式)
以达到高效、重复使用的目的。图表生成引擎的设计难点是什么?该如何处理?如何优化引
擎?我们将提供具体的实例加以讲解。通过本章的学习,读者将会感受到,图表引擎的设计
原来可以这么轻松地实现!
本书的适用对象
本书适合从事 Java 及 Web 编程的开发人员, JSP/Servlet 应用程序中需要提供图表显
在
示及处理功能的 JSP/Servlet 程序开发者,以及编程爱好者阅读。对于初学入门的应用开发
人员,可以作为自学的实践指导书;对于已经从事 Web 编程工作的人员,可以作为一本供随
时翻阅查询的案头参考书。
建议
我们建议读者在学习期间避免使用可视化的开发工具, 例如: JBuilder、JCreator、KAWA、
Visual Cafe、Eclipse、IntelliJ IDEA、BEA WebLogic Workshop、Oracle JDeveloper 等,
所有工作都可以使用 JSP 服务器(Tomcat/Resin)+ WWW 浏览器(IE/Mozilla/Firefox)+文
本编辑器(EditPlus)来完成。附录中,我们向读者介绍了一种优秀的 Java IDE 开发工具—
—Gel。利用 Gel,可以方便地创建、编辑、编译及运行 Java/JSP/Servlet 应用程序。
为了达到最佳的学习效果,我们建议读者在阅读本书的同时,亲自动手按照本书的示例
去操作。 所有的源程序都可以在 www.broadview.com.cn 网站上下载, 但建议读者最好对照源
程序自己动手录入一次,这样可以加深理解和记忆。
因本书的例程非常丰富,为节省篇幅,故基本上不列出每个例程的完整清单。本书详尽
地讲解了每个源程序的设计思路、 运行机制及相对应的核心代码段。 建议读者在阅读本书时,
首先用 EditPlus 之类的文本编辑器来打开相应例程的源程序, 其次阅读其完整的源程序, 最
后再阅读本书的讲解,相信这样会让读者取得事半功倍的效果。
致谢
本书由钟京馗(City University of New York)执笔主编和最后定稿。唐桓(University
of Bridgeport)参与本书例程的编写与调试工作。
本书出版之际,特别鸣谢钟志祥、李美行、朱晓蕾、朱正才、胡元妹、黄桂玉、武冠军、唐
光富、彭燕给予的大力支持与协助。
在编写本书的过程中,我们尽力保持内容的科学性、先进性和实用性,同时力求做到讲
解原理,深入浅出,语言通俗易懂。但鉴于作者学识有限,不足之处在所难免,见仁见智,
恳请广大读者指正。我们将在本书的再版中使其更臻完善。
钟京馗
2005 年 9 月于纽约
4. 第 1 章 Java 概述 1
1.1 Java 简介 1
1.1.1 Java 发展简史 1
1.1.2 Java 的体系 2
1.1.3 Java 的优点 3
1.2 Java 开发环境的搭建 4
1.2.1 Java 运行环境的要求 4
1.2.2 Java 的安装和配置 6
1.3 Java/JSP 开发工具 8
1.3.1 EditPlus 简介 9
1.3.2 UltraEdit 简介 11
1.3.3 其他 Java/JSP 开发工具 13
1.4 第一个 Java 程序 15
1.5 本章小结 17
第 2 章 Java Applet 与绘图基础 18
2.1 Java Applet 概述 18
2.2 Java Applet 工作流程 20
2.2.1 组件与容器 20
2.2.2 Applet 的编译与执行 22
2.2.3 包含 Applet 的 HTML 23
2.3 绘制文本(字符串) 23
2.4 绘制线段 29
2.5 色彩管理 31
2.5.1 色彩基础 31
2.5.2 Java 的色彩管理 34
2.6 字体控制 36
2.7 绘制矩形 40
2.7.1 绘制普通矩形 40
2.7.2 绘制 3D 矩形 43
2.8 绘制椭圆 46
2.8.1 绘制普通(空心)椭圆 46
2.8.2 绘制实心椭圆 48
2.8.3 绘制 3D 椭圆 49
2.8.4 绘制圆柱体 50
2.9 绘制圆弧 54
2.9.1 绘制普通(空心)圆弧 55
2.9.2 绘制实心圆弧 56
2.9.3 绘制 3D 圆弧 57
2.10 绘制多边形 59
2.10.1 绘制空心多边形 59
2.10.2 绘制实心多边形 61
2.10.3 绘制折线 61
2.10.4 绘制三角形(箭头) 62
2.10.5 绘制平行四边形及立方体 69
5. 2.11 图像的载入与显示 78
2.11.1 在 Applet 中加载和
2.11.1 显示图像 78
2.11.2 使用 MediaTracker 加载并
2.11.2 显示图像 84
2.11.3 使用双缓冲技术绘制图像 89
2.12 本章小结 93
第 3 章 Java Applet 图表绘制实例 94
3.1 Java Applet 生成 Web
3.1 动态图表 94
3.1.1 垂直柱状图 95
3.1.2 饼图 102
3.2 Java Applet 生成单据 109
3.2.1 带徽标的 Web 动态图表 110
3.2.2 支票的生成 111
3.3 从 HTML 文档获取参数
3.3 生成动态图表 123
3.3.1 传递参数的 HTML 文档 123
3.3.2 获取参数并生成图表 124
3.4 本章小结 126
第 4 章 JSP/Servlet 运行环境的搭建 128
4.1 Tomcat 的安装和配置 128
4.1.1 Tomcat 的安装 129
4.1.2 测试第一个 JSP 程序 132
4.1.3 配置 Tomcat 132
4.1.4 转换后的 JSP 页面文件 145
4.2 Resin 的安装和配置 147
4.2.1 Resin 的安装 147
4.2.2 Resin 的配置 149
4.3 BEA Weblogic 的安装和配置 150
4.3.1 BEA Weblogic 的安装 150
4.3.2 BEA Weblogic 的配置 152
4.3.3 测试 BEA Weblogic
4.3.3 的配置 155
4.3.4 部署第一个 Web
4.3.4 应用程序 156
4.4 本章小结 157
第 5 章 基于 Servlet 的 Web 图表编程 158
5.1 Servlet 简介及其构架 158
5.1.1 Servlet 的特点 158
5.1.2 Servlet 的接口 159
5.1.3 HttpServlet 类简介 160
5.1.4 HttpServletRequest 接口 161
5.1.5 HttpServletResponse 接口 162
6. 5.2 Servlet 处理 HTTP get 请求 163
5.3 Servlet 处理包含数据的 HTTP
5.3 get 请求及解决中文乱码 177
5.4 Servlet 处理 HTTP post 及包含
5.4 数据的 post 请求 187
5.5 Servlet 生成 Web 投票统计图 191
5.6 Servlet 生成登录验证码 198
5.6.1 Servlet 生成登录验证码
5.6.1 实例 1 199
5.6.2 Servlet 生成登录验证码
5.6.2 实例 2 209
5.7 Servlet 高级设置 214
5.7.1 Servlet 初始化参数 214
5.7.2 Servlet 加载优先级 216
5.7.3 Servlet 映射 217
5.8 Servlet 绘制甘特图 218
5.9 Servlet 绘制 3D 甘特图 222
5.10 本章小结 228
第 6 章 JSP Web 图表编程基础 229
6.1 JSP 概述 230
6.1.1 JSP 运行机制 231
6.1.2 JSP 的优点 233
6.2 JSP 语法简介 234
6.2.1 JSP 文件结构 234
6.2.2 JSP 文件中的元素简介 240
6.3 JSP 调用 Servlet 生成
6.3 动态图表 257
6.3.1 JSP 生成验证码 257
6.3.2 JSP 生成甘特图 258
6.3.3 JSP 其他相关知识 258
6.4 JSP 生成基本动态图表 260
6.4.1 JSP 绘制文本和线段 260
6.4.2 JSP 与字体控制 266
6.4.3 JSP 绘制矩形 273
6.4.4 JSP 绘制椭圆 275
6.4.5 JSP 绘制圆弧 276
6.4.6 JSP 绘制多边形和折线 277
6.4.7 JSP 绘制三角形 277
6.4.8 JSP 绘制平行四边形和
6.4.8 立方体 280
6.4.9 JSP 加载并显示图像 281
6.5 本章小结 282
第 7 章 JSP 与 Java2D Web 图表编程 283
7.1 Java2D 概述 283
7. 7.2 Java AWT 与 Java2D 285
7.3 Java2D 与填充属性 287
7.3.1 设置填充属性 287
7.3.2 填充属性的用法 287
7.4 Java2D 与笔划属性 291
7.4.1 线段端点的形状风格 292
7.4.2 线段转折处的形状风格 292
7.4.3 虚线风格 293
7.4.4 BasicStroke 构造器 294
7.4.5 Java2D Web 图表实例
7.4.5 之折线图 294
7.5 创建基本 Java2D 图形 309
7.5.1 Java2D 图形(Shape)
7.5.1 接口概述 309
7.5.2 Point2D 310
7.5.3 Line2D 311
7.5.4 Rectangle2D 312
7.5.5 RoundRectangle2D 314
7.5.6 Java2D Web 图表实例之
7.5.6 柱状图 315
7.5.7 Ellipse2D 333
7.5.8 Arc2D 334
7.6 Java2D 实例饼图类图表 337
7.6.1 普通饼图 338
7.6.2 圆圈图 342
7.6.3 3D 饼图 344
7.7 图形重叠 346
7.8 alpha 复合 348
7.8.1 alpha 复合概述 348
7.8.2 AlphaComposite 类的使用 350
7.8.3 AlphaComposite 应用实例 352
7.9 图形对象的转换 357
7.9.1 图形对象转换(transformation)
7.9.2 概述 357
7.9.2 平移(translation) 359
7.9.3 旋转(rotation) 360
7.9.4 缩放(scale) 362
7.9.5 扭曲(shear) 364
7.10 图形渲染线索 366
7.11 Java2D 与高级文本处理 368
7.11.1 空心文本 368
7.11.2 弯曲文本 369
7.11.3 单行长文本自动分行 371
7.12 Java2D 创建复杂图形 373
8. 7.12.1 Area 374
7.12.2 曲线 375
7.12.3 通用路径 377
7.13 Web 图表实例解析 379
7.13.1 透明 3D 饼图 379
7.13.2 股市指数走势图 381
7.14 本章小结 391
第 8 章 开放源代码作品与 Web 图表编程 392
8.1 开放源代码作品简介 392
8.2 JFreeChart 与 JSP 图表编程 394
8.2.1 JFreeChart 简介 394
8.2.2 JFreeChart 的安装及其
8.2.2 核心类 395
8.2.3 JFreeChart 生成直方图表 398
8.2.4 JFreeChart 生成饼型图表 411
8.2.5 JFreeChart 生成线段图表 416
8.2.6 JFreeChart 生成区域图表 420
8.2.7 JFreeChart 生成时序
8.2.7 (Time Series)图表 424
8.2.8 JFreeChart 生成甘特图表 430
8.2.9 JFreeChart 生成多轴
8.2.9 (Multiple Axis)图表 432
8.2.10 JFreeChart 生成组合
8.2.10 (Combined Axis)图表 435
8.2.11 JFreeChart 生成其他类型
8.2.11 的图表 441
8.3 JFreeChart 与 Servlet
8.3 图表编程 444
8.3.1 简单的 Servlet 图表编程 444
8.3.2 交互式 Servlet 图表编程 446
8.4 Cewolf 与 JSP 图表编程 448
8.4.1 Cewolf 简介 448
8.4.2 Cewolf 的下载与安装 448
8.4.3 Cewolf 生成直方图表 450
8.4.4 Cewolf 生成基于 DefaultCategory
8.4.4 Dataset 数据集的图表 454
8.4.5 Cewolf 生成饼图 460
8.4.6 Cewolf 生成基于 XYDataset
8.4.6 数据集的图表 462
8.4.7 Cewolf 生成基于 OHLCDataset
8.4.7 数据集的图表 465
8.4.8 Cewolf 生成甘特图表 466
8.4.9 Cewolf 生成信号图表 467
8.4.10 Cewolf 生成速度图表 468
9. 8.4.11 Cewolf 生成 OverLay 类型
8.4.11 的图表 468
8.4.12 Cewolf 生成组合图表 470
8.4.13 生成自定义风格的
8.4.13 Cewolf 图表 472
8.5 本章小结 473
第 9 章 Web 图表生成引擎的设计思路与实现 475
9.1 Web 动态图表生成引擎的
9.1 设计思路 475
9.2 Web 动态图表生成引擎的
9.2 设计模型 480
9.2.1 生成普通线段图的
9.3.2 JavaBean 480
9.2.2 生成 3D 线段图的
9.3.2 JavaBean 483
9.2.3 生成普通直方图的
9.3.2 JavaBean 484
9.2.4 生成 3D 直方图的
9.3.2 JavaBean 487
9.2.5 生成普通饼图的
9.3.2 JavaBean 488
9.2.6 生成 3D 饼图的
9.3.2 JavaBean 490
9.3 数据分离 491
9.3.1 创建及调用 CategoryDataset
9.3.2 类数据集对象 491
9.3.2 创建及调用 PieDataset 类
9.3.2 数据集对象 495
9.4 引擎的优化概述 496
9.5 本章小结 498
附录 Gel 使用指南 499
10. 第 1 章 Java 概述
Java 是美国 Sun 微系统公司(Sun Microsystems, Inc.)开发,近年来飞速发展的一项崭
新的计算机技术。
1.1 Java 简介
Java 既是一种程序设计语言,也是一个完整的平台。作为一种程序语言,它简洁、面向
对象、 安全、 健壮,以及适用于 Internet 技术;而作为一个平台(JRE,
Java Runtime Environment,
Java 运行环境或者说是 Java 虚拟机)对于符合 Sun 公司 Java 标准的应用程序,
, 都可以在 Java
平台上正确运行,与程序运行的操作系统无关。
Java 为什么能够成为目前编写 Web 应用程序的首选设计语言呢?并且具备跨平台的能
力呢?我们先简单地了解一下 Java 的发展历史和体系结构。
1.1.1 Java 发展简史
Java 起初并非叫做 Java,而是叫做 Oak。早期是为了嵌入式系统而设计的一项产品。20
世纪 90 年代初期, 公司预测微处理器的发展将会对家用电器以及智能化电子消费设备起
Sun
到决定性的作用,于是,在 1990 年 12 月,Sun 公司就由 Patrick Naughton、Mike Sheridan 和
James Gosling 成立了一个叫做 Green Team 的小组。其主要目标就是开发一种分布式系统架
构,使其能够在智能化电子消费设备作业平台上执行。例如,PDA、手机、信息家电(IA,
Internet/Information Appliance)等。一开始,准备采用 C++,但 C++太过复杂,安全性差。
最后,基于 C++开发出一种新的语言 Oak,Oak 是一种用于网络、精巧而安全的语言。
1992 年,Green Team 发表了一款名叫 Star Seven(*7)的机器,它有点像现在我们熟悉
的 PDA,但市面上的 PDA 几乎都不是它的对手,更不要说是早在 10 年前那个计算机还不普
及的时代了。Java 语言的前身 Oak 就这样诞生了,主要目的是用来编写在 Star Seven 上的应
用程序。为什么叫 Oak 呢?原因是 James Gosling 办公室的窗外,正好有一棵橡树(Oak) ,
就取了这个名字。至于为什么 Oak 又会改名为 Java 呢?这是因为在 Oak 注册商标时,发现
已经被另外一家公司使用了。那要取什么新名字呢?工程师们边喝着咖啡边讨论着,看着手
中的咖啡,突然灵机一动,就叫 Java 好了。就这样它就变成了大名鼎鼎、如日中天的 Java
了。
但是,Green Team 的项目发展却不尽如人意。智能化电子消费设备的市场发展远远低于
Sun 的预期设想。 Sun 公司曾依此投标一个交互式电视项目, 结果被 SGI 打败了。 可怜的 Oak
几乎无家可归,就在举步维艰,随时会被取消的时刻,情况却发生了巨大变化。1993 年,因
特网在美国开始大规模的发展,基于因特网的 WWW 也爆炸性地流行起来。Sun 公司发现,
Green Team 的项目研究成果——Java 似乎天生就是为因特网而诞生的,因为恰巧就是 Mark
Andreessen 开发的 Mosaic 和 Netscape 启发了 Oak,他们利用 Java 开发了 HotJava 浏览器,得
到了 Sun 公司首席执行官 ScottMcNealy 的支持,触发了 Java 进军 Internet。
于是,Java 第一次以 Applet 的形式在因特网上出现了。Applet 不但使 WWW 页面显示
静态的内容,而且可以显示动态的内容和动画。同时实行了本地计算机,从远程联网的服务
11. 器上下载资料并正确地显示出来。这些技术在当时引起了巨大的震撼,促使 Java 在因特网上
得以飞速地发展。
1995 年 5 月 23 日, 在 SunWorld’95 上正式发布 Java 和 HotJava 浏览器。
Sun
1.1.2 Java 的体系
Java 发展到今天,已从编程语言发展成为全球第一大通用开发平台。Java 技术已被计算
机行业主要公司所采纳。 1999 年, 公司推出了以 Java2 平台为核心的 J2EE、
Sun J2SE 和 J2ME
三大平台。随着三大平台的迅速推进,全球形成了一股巨大的 Java 应用浪潮。
1.Java 2 Platform, Micro Edition(J2ME)
Java 2 平台微型版。Sun 公司将 J2ME 定义为“一种以广泛的消费性产品为目标、高度
优化的 Java 运行环境”自 1999 年 6 月在 JavaOne Developer Conference 上声明之后,
。 J2ME
进入了小型设备开发的行列。 通过 Java 的特性, 遵循 J2ME 规范开发的 Java 程序可以运行在
各种不同的小型设备上。
2.Java 2 Platform, Standard Edition(J2SE)
Java 2 平台标准版,适用于桌面系统应用程序的开发。本书例程就是利用 J2SE 5.0 版的
相关图形 API 包来开发的。
3.Java 2 Platform, Enterprise Edition(J2EE)
J2EE 是一种利用 Java 2 平台来简化企业解决方案的开发、 部署和管理等相关复杂问题的
体系结构。J2EE 技术的核心就是 Java 平台或 Java 2 平台的标准版,J2EE 不仅巩固了标准版
的许多优点,例如: “一次编写、随处运行”的特性、方便存取数据库的 JDBC API、CORBA
技术,以及能够在 Internet 应用中保护数据的安全模式等,同时还提供了对 EJB(Enterprise
JavaBeans)、Java Servlets API、JSP(Java Server Pages)
,以及 XML 技术的全面支持。
本书第 4 章,阐述了如何将我们开发的 JSP 图表应用程序,在 J2EE 平台上进行部署和
管理。
1.1.3 Java 的优点
Java 是一种面向对象、分布式、解释、健壮、安全、可移植、性能优异,以及多线程的
语言。下面简单介绍其中的几个优点。
1.Write Once, Run Anywhere
“一次编写, 随处运行” 这是程序设计师们喜爱 Java 的原因之一,
。 核心就是 JVM(Java
虚拟机)技术。
编写好一个 Java 程序, 首先,要通过一段翻译程序, 编译成一种叫做字节码的中间代码。
然后经 Java 平台的解释器,翻译成机器语言来执行——平台的核心叫做 JVM。Java 的编译
过程与其他语言不同。例如,C++在编译的时候,是与机器的硬件平台信息密不可分的。
编译程序通过查表将所有指令操作数和操作码等,转换成内存的偏移量,即程序运行时的
内存分配方式,以保证程序运行。而 Java 却是将指令转换成为一种扩展名为 class 的文件,
这种文件不包含硬件的信息。只要安装了 JVM,创立内存布局后,通过查表来确定一条指
令所在的地址,这就保证了 Java 的可移植性和安全性。
上述 Java 程序的编译和运行流程,如图 1.1 所示。
12. Interpreter 编译器 ①:编译
MyApp.java
②:运行
源文件 Ø 装载类
① Ø 生成字节码
Ø 及时编译
Ø 解释执行
②
Java Java Java
应用 应用 应用
程序 程序 程序
JVM JVM JVM
(J2SE) (J2SE) (J2ME)
Unix/Linux MS Windows Palm OS
图 1.1 Java 的编译和运行流程
13. 2.简单
纯粹的面向对象,加上数量巨大的类所提供的方法(函数)库的支持,使得利用 Java 开
发各种应用程序,可以说是易如反掌。此外,在程序除错、修改、升级和增加新功能等方面,
因其面向对象的特性,使得这些维护也变得非常容易。
3.网络功能
Java 可以说是借助因特网而重获新生的,自然具备编写网络功能的程序。不论是一般因
特网/局域网的程序,如 Socket、Email、基于 Web 服务器的 Servlet、JSP 程序,甚至连分
布式网络程序,如 CORBA、RMI 等的支持也是非常丰富的,使用起来也很方便。
4.资源回收处理(Garbage Collection)
Garbage Collection 是由 JVM 对内存实行动态管理的。程序需要多少内存、哪些程序的
内存已经不使用了,需要释放归还给系统,这些烦琐且危险的操作全部交由 JVM 去管理。
让我们能够更专心地编写程序,而不需要担心内存的问题。内存的统一管理,对于跨平台也
有相当大的帮助。
5.异常处理(Exception)
为了使 Java 程式更稳定、更安全,Java 引入了异常处理机制。能够在程序中产生异常情
况的地方,执行相对应的处理,不至于因突发或意外的错误造成执行中断或是死机。通过这
种异常处理,不仅能够清晰地掌握整个程序执行的流程,也使得程序的设计更为严谨。
1.2 Java 开发环境的搭建
现在我们开始搭建 Java 开发环境。本章仅涉及 J2SDK 开发环境的安装与调试,并不涉
及 JSP 及 J2EE 服务器的安装与调试,这部分内容将在第 4 章进行说明。
1.2.1 Java 运行环境的要求
首先,需要了解 Java 对计算机主要硬件要求的最低配置,如表 1.1 所示。该表右边部分
为笔者写作本书时所使用的计算机配置。因为涉及大量在计算机内存中进行绘制各种图表的
运算与操作,建议使用较高配置的计算机以及尽可能多的内存,以便流畅地运行本书中的程
序。
表 1.1 Java 的计算机硬件配置
硬 件 最低要求 笔者的配置
CPU Intel 或者兼容微处理器,奔腾 166MHz 及其以上 AMD Athlon 3200+
最低 32MB,可以运行图形界面的 Java Application; 512 MB DDR,Kingston 内存
内存 最低 48MB,可以运行 Java Applet;内存不足,将会导 (如果读者希望把本书中的例程运行在 J2EE 的
致系统(尤其是服务器)的性能大幅下降 服务器,如 WebLogic,最好不低于 256 MB)
硬盘 242 MB 80 GB
图形显示卡 无要求 Nvidia Ti 4200 64 MB DDR
网卡 普通网卡 3Com OfficeConnect 10/100 兆位网卡
其他部件,如图形显示卡、光驱及显示器等,Java 并没有特别的要求。因为本书涉及图
14. 形的实时生成, Java 的图形生成是通过图形显示卡调用 OpenGL 功能来加速图像的渲染和
而
处理的。因此,如果系统拥有一块高质量的图形显示卡,将会大大地提高系统的性能。目前
市面上的图形显示卡,无论是在计算机主板上集成的显卡,还是普通的独立图形显示卡,都
具有强大的图形处理功能,足以满足流畅地运行本书中的所有例程。
Java 具有跨平台的特点,支持所有的主流操作系统,如下所示。
1.微软公司 Windows 系列
Ø Windows 98 / Me
Ø Windows NT
Ø Windows 2000 / Windows 2000 Server
Ø Windows XP
Ø Windows 2003 Server
2.UNIX 系列
Ø AIX,
IBM 的 UNIX, 是根据 SVR2 以及一部分 BSD 延伸而来, 加上各种硬件的支持。
具备特有的系统管理功能(SMIT,系统管理接口工具) 。
:基于 4.3BSD,包含许多来自 System V 的东西。Sun
Ø SunOS(680x0,Sparc,i386)
公司开发的 UNIX 操作系统,该系统对 UNIX 的贡献是:NFS,OpenLook GUI 标准,
现演变为 Solaris。
Ø HPUX(HP) :惠普公司的 UNIX。
Ø SCO UNIX。
3.类 UNIX 系列
Ø Linux:包括各种版本的 Linux,如 RedHat、Turbo 和 Mandrake Linux。
Ø FreeBSD:由美国加州大学伯克利分校计算机系统研究小组设计和维护。
15. 4.其他操作系统
Ø Mac OS:苹果电脑公司推出的操作系统,主要用于 Power PC。
上述操作系统都可以安装 Java。 笔者的操作系统是微软 Windows XP SP2。本书的所有例
程都是在 Windows XP 环境下进行编写和调试的。
1.2.2 Java 的安装和配置
本书采用 Sun 公司发布的最新版本,也是近年来 Java 最重要的一个升级版本——Java 2
Platform Standard Edition 5.0,即 J2SE 5.0 作为我们的 Java 开发平台。至于 J2SE 5.0 具备哪些
新的功能和特性,请读者自行查阅相关资料。本书将尽量使用 J2SE 5.0 中的新特性来增强代
码的性能,如 Image I/O、Java 2D 等,具体将在其他章节中说明。
J2SE 5.0 的下载地址:http://java.sun.com/j2se/1.5.0/download.jsp。双击下载文件:jdk1_
5_0windowsi586.exe 就开始了 J2SE 5.0 开发环境的安装过程,如图 1.2 所示。
默认
图 1.2 Java 的安装过程者一:改变默认的安装路径
安装过程如下:
(1) 安装程序经过自解压后, 就会出现安装协议的对话框, 【I accept the terms in the
选择
license agreement】并单击【Next】按钮;
(2)在出现选择安装路径的对话框时,我们改变 J2SE 5.0 的默认安装路径。单击右边
的【Change…】按钮,在出现的路径修改对话框中,输入“c:jdk1.5.0”后退回到先前的对话
框;
(3)单击【Next】按钮,继续剩余部分的安装。接着 J2SE 5.0 会提示 Java 运行环境(即
JRE 5.0)的安装路径,这里不做任何的改变,采用其默认设置。
然后,连续单击【Next】按钮直到完成安装。最后系统会提示重新启动计算机,再重新
启动计算机,需要对运行 Java 的环境变量进行设置。这是非常重要的一个步骤,如果没有设
置成功,在运行 Java 时会出现错误。
环境变量的设置,如图 1.3、图 1.4 所示。
16. 图 1.3 Java 的安装过程之二:环境参数的设置
(1)进入【控制面板】,单击【系统】 ,在出现的【系统属性】对话框中,单击【高级】
选项。
(2)单击【环境变量】按钮。
(3)在环境变量对话框中,单击位于【系统变量】组中的【新建】按钮。
(4)新建一个系统变量, “变量名”为 JAVA_HOME,“变量值”为 C:JDK1.5.0,然后
单击【确定】按钮,如图 1.4 所示。这个 JAVA_HOME 的值就是 J2SE 5.0 的安装路径。
图 1.4 Java 的安装过程之三:环境参数的设置
(5) 重复第 4 步, “变量名”
在 中输入“CLASSPATH” 在
, “变量值”中输入 “.
%JAVA _HOME%lib”。注意,这里的“.”是要求 JAVA 编译器在查找 JAVA class 文件时,首
先从当前目录开始。
(6)最后是修改系统变量“PATH”的值, PATH”的新值是在原有值前面加上
“
“%JAVA_HOME%bin;”。
提示:在 Java 1.2 版以后,不再需要 CLASSPATH 来设置系统类的路径。CLASSPATH
是为了设置用户编写的类或者第三方开发的类库而设置的。
现在,为确保系统环境变量生效,重新启动计算机。重启之后,测试 J2SE 5.0 的安装与
环境变量设置是否正确。单击【开始】→【所有程序】→【附件】→【命令提示符】 ,启动命
令提示符后,在该窗口中输入如下命令:
echo %java_home%
echo %classpath%
echo %path%
17. java –version
在笔者本机上,得到如图 1.5 所示的结果。
图 1.5 测试 Java 运行环境系统参数的设置
如果读者得到如图 1.5 一样的结果,就说明最新版的 Java 开发环境已经安装成功。
提示:读者计算机中“Path”值可能同笔者计算机的值不一样,但其中一定要包含
“C:jdk1.5.0bin”的内容。
1.3 Java/JSP 开发工具
为了获得 Java 图表编程学习的最佳效果, 本书所有源程序都没有使用任何一种可视化的
Java 开发环境来进行开发。建议读者在学习期间不要使用可视化的开发工具,如 JBuilder、
JCreator、KAWA、Visual Cafe、Eclipse、IntelliJ IDEA、BEA WebLogic Workshop、Oracle
JDeveloper 等。本书所有的操作,都可以用 JSP 服务器(Tomcat/Resin)+WWW 浏览器
(IE/Mozilla/Firefox)+文本编辑器(EditPlus)来轻松完成。这样,我们才可以深刻地理解
系统的运行机制。等到读者对此非常熟悉的时候,再使用可视化开发工具进行开发,定会达
到事半功倍的效果。此外,在本书的附录中,我们将向读者介绍一款优秀的 Java IDE 开发工
具——Gel。利用 Gel,可以方便地创建、编辑、编译及运行 Java/JSP/Servlet 应用程序。建议
读者循序渐进地学习之后,再来学习 Gel,相信一定会喜欢上这款精巧而强大的 Java 开发环
境。
基于文本编辑器的 Java/JSP 开发工具有很多种,如记事本、UltraEdit、EditPlus 等。但最
简单及成本最低廉的非 Windows 自带的记事本(NotePad)莫属了。可以直接使用记事本进
行 Java/JSP 的程序设计, 它具有简单、方便的特点。 但其毕竟不是为程序员准备的开发工具,
因此,并不适用于程序设计。
现在,向读者推荐一款韩国的文本编辑器——EditPlus 作为我们的 Java 及 JSP 编辑器。
1.3.1 EditPlus 简介
EditPlus 是由韩国人编写的一款共享软件,官方网址是 www.editplus.com。最新版本是
EditPlus 2.12。EditPlus 是功能全面的文本、HTML、程序源代码编辑器。主要特点如下:
(1)默认支持 HTML、CSS、PHP、ASP、Perl、C/C++、Java、JavaScript 和 VBScript
的语法高亮显示,通过定制语法文件,可以扩展到其他程序语言。
(2)EditPlus 提供了与 Internet 的无缝连接,可以在 EditPlus 的工作区域中打开 Intelnet
浏览窗口。
18. (3)提供了多工作窗口。不用切换到桌面,便可在工作区域中打开多个文档。
(4)正确地配置 Java 的编译器“Javac”以及解释器“Java”后,使用 EditPlus 的菜单
可以直接编译执行 Java 程序。
所谓的文本编辑器,最终还是要归结在文本编辑上。EditPlus 提供了比普通编辑器更加
强大的编辑功能。首先可以无限制地 Undo,其次具有更强大的删除功能,EditPlus 不仅可以
删除一个字,而且还可以删除选择部分、删除整个行等。提供了更强大的复制功能,可以复
制整个行,如单击【Edit】菜单,选择【Duplicate line】命令,即可实现此功能。这些大大地
超越了记事本的功能。
EditPlus 查找/替换功能也是一流的。不但可以进行一般的查找和替换,而且支持以正则
表达式的方式进行查找与替换, 甚至可以在磁盘某一目录的所有文件中, 进行字符串的查找。
比如说,笔者要查找 D:webchart 目录(包括其子目录)下,所有的 jsp 文件中,哪些文件包
含了字符串: “charset=GB2312”,我们就可以单击菜单栏上的【Search】 ,选择【Find in Files】
命令。如图 1.6 所示,在出现的查找对话框中,分别填入以下内容:
Ø【Find what】填入“charset=GB2312”,表示要查找的内容。
Ø【File type】填入“*.jsp” ,表示要查找所有扩展名为 jsp 的文件,如果这一栏不输入
任何条件,则表示在所有的文件中查找,而忽略文件的格式。
Ø【Folder】填入“d:webchart” ,表示希望查找文件位于 d:webchart 这个目录下。
Ø 如果要查找 d:webchart 及其子目录下的所有 jsp 文件,就需要选中该对话框中的
“include subfolders”选项。
填好上述栏目后,单击该对话框中的【Find】按钮,就可以在 EditPlus 下方的输入输出
窗口中,得到查找的结果了。在输出窗口中,会提供一个被查找到的匹配文件的清单。在此
窗口的左侧,指出与被查找的字符串“charset=GB2312”相匹配文件的所在目录以及文件名,
然后给出字符串在该文件中出现的位置,该位置用行列坐标表示。在输出窗口的最底部,
EditPlus 会提供一个统计结果——查找到的匹配的文件总数。
图 1.6 EditPlus 的 Find in Files 功能
双击查找结果清单中出现的任一文件名,EditPlus 会在主窗口中显示出该文件的内容,
并将鼠标指针定位到被查找的字符串第一次出现的位置。
该功能在大量文件中进行查找时,提供了强大的支持。
前面谈到,设置好 Java 的编译器“Javac”和解释器“Java”后,通过 EditPlus 的菜单可
20. 运行 Java 的配置
图 1.7 EditPlus 设置编译与运行 Java 程序的功能
Ø【Add Tool】 :表示新增一个用户自定义工具。
Ø【Program】 :表示该工具与程序有关。
Ø【Menu text】 :表示要求为添加的工具命名。这里填入:编译 JAVA。
Ø【Command】 :表示该工具运行时,所调用的可执行程序。Java 中的编译命令是 javac,
所以这里选择 Java 安装目录中 bin 子目录中的 javac.exe 程序。
Ø【Argument】 :表示执行 javac.exe 程序时,所需要的参数。单击旁边的带有向下三角
形的按钮来选择“$(FilePath) ”即可。
Ø 【Initial directory】:选择初始化目录。单击旁边的带有向下三角形的按钮来选择“$
(FileDir) ”即可。
Ø【Capture output】 :选择捕获屏幕输出。
通过 EditPlus 来编译 Java 程序完成。现在继续增加一个新的工具,设置通过 EditPlus 来
运行编译成功的 Java 程序。方法同前面讲述的设置编译 Java 程序的过程基本相同。按照图
1.7 右下方所示的“运行 Java 的配置”内容,进行设定即可。
正确设置后,无论在 EditPlus 编译还是运行 Java 程序的时候,EditPlus 的输出窗口中都
会显示出相应的编译和运行结果。
关于 EditPlus 就简要介绍到这里。
1.3.2 UltraEdit 简介
UltraEdit 是共享软件,官方网址是 www.ultraedit.com,最新版本是 v11.00a。与 EditPlus
类似,UltraEdit 是一款功能强大的文本、HTML、程序源代码编辑器。作为源代码编辑器,
其默认配置可以对 C/C++、VB、HTML、Java 和 Perl 进行语法高亮显示。设计 Java 程序也
很方便,具有复制、粘贴、剪切、查找、替换、格式控制等编辑功能。
UltraEdit 同样可以在【Advanced】菜单的【Tool Configuration】菜单项配置 Java 编译器
Javac 和解释器 Java,直接编译运行 Java 程序。
UltraEdit 设置 Java 编译器“Javac”的方法如图 1.8 所示。
21. 图 1.8 UltraEdit 设置编译 Java 程序的功能
Ø【Command Line】 :表示命名行的执行方式。n%表示 Java 源程序的文件名,%e 表示
Java 源程序的扩展名。因为已经正确设置了 Java 的运行路径,所以使用 javac 就可以
了,否则就要用 C:jdk1.5.0binjavac.exe。
Ø【Working Directory】 :表示工作目录。%p 表示工作目录就是当前目录。
Ø【Menu Item Name】 :要求给添加的工具命名。填入:编译 JAVA。
Ø【Save Active File】:表示该工具运行之前,首先保存当前 Java 源程序。
Ø【Output to List Box】:表示将结果输出到列表框中。
Ø【Capture Output】 :选择捕获屏幕输出。
Ø【Insert】:Java 编译的工具菜单就做好了。
同理,设置 Java 解释器“Java”的方法如图 1.9 所示。与前面的步骤类似,只需要更改
第一和第三个步骤即可。 【Command Line】输入“java %n”【Menu Item Name】输入“运行
,
Java”。
关于 UltraEdit 就简单介绍到这里。
22. 图 1.9 UltraEdit 设置运行 Java 程序的功能
1.3.3 其他 Java/JSP 开发工具
下面向读者简要介绍两个开放源代码的作品 Eclipse 和 Gel,虽然本书并不使用这两种开
发工具,但笔者觉得有必要向读者介绍一下,目前国外非常流行的 Java IDE 开发工具。
1.Eclipse 简介
Eclipse 是一个开放源代码的项目, 可以在 www.eclipse.org 免费下载 Eclipse 的最新版本。
一般 Eclipse 提供几种下载版本:Release、Stable Build、Integration Build 和 Nightly Build。建
议下载 Release 或 Stable 版本。Eclipse 本身是用 Java 语言编写的,但下载的压缩包中并不包
含 Java 运行环境,需要用户自行安装 JRE,并且需要在操作系统的环境变量中,指明 JRE 中
bin 的路径。如果已经安装了 JDK,就不用安装 JRE 了。
安装 Eclipse 的步骤非常简单,只需将下载的压缩包按原路径直接解压即可。注意,如果
要更新版本,请先删除旧版本重新安装,不能直接解压到原来的路径覆盖旧版本。解压缩之
后,可以到相应的安装路径去找 Eclipse.exe 运行。如果下载的是 Release 或 Stable 版本,并
且 JRE 环境安装正确无误, 一般来说不会有什么问题, 在闪现一个很酷的月蚀图片后, Eclipse
会显示它的默认界面。
Eclipse 的界面有点像 JBilder,实际操作进程中会发现它更像 IVJ。毕竟开发 Eclipse 的主导
是开发 IVJ 的原班人马(可参考 www.oti.com) 。值得一提的是,Eclipse 项目的参与者除了 IBM
以外,还有 Borland、Rational Software、RedHat、Merant,以及 BEA 等一大批业界的佼佼者,为
Eclipse 的未来奠定了良好的基础。
Eclipse 不仅可以开发 Java 应用程序,还可以安装 Lomboz 插件,并整合 Tomcat 以实现
对 JSP 以及 Java Servlets 的开发。
本书不在这里讨论 Eclipse 的下载、安装、使用、开发、各种插件的安装和使用,以及与
JBoss、Tomcat、WebLogic 等 JSP 或者 J2EE 服务器的整合。有兴趣的读者,请自行查阅相关
资料。
2.Gel 简介
Gel 是由 Gerald Nunn 发布的一款 Java IDE 开发工具。Gel 的官方主页是 http://
memescape.co.uk/gexperts/index.html。Gel 是完全免费的,读者可到该网站下载。在本书写作
时,Gel 的最新版本是 RC39。目前该 IDE 工具,在国外众多的 Java、JSP 及 J2EE 程序员中
23. 引起了极大的反响,但国内很少有人使用这款优秀的 Java IDE。
Gel 的运行环境如下:
Ø Windows 95/98/ME/2000/XP
Ø Internet Explorer 4+
Ø JDK 1.1+
Gel 的特点如下:
(1)编辑器(Editor)
Ø 支持对 Java、JSP、HTML、XML、C、C++、Perl、Python,以及更多编程语言的语
法高亮显示。
Ø 无限制地取消及恢复功能。
Ø 整段代码的减少缩进量与增加缩进量。
Ø 高亮显示配对的大括号。
Ø 实时地拼写检查。
Ø 可以显示控制字符。
Ø 整合的源代码管理及控制, 支持 CVS、VSS、Clearcase、Perforce、QVCS、CSRCS 以
及更多的格式。
Ø 正则表达式搜索。
Ø 文件查找。
Ø 将被选择代码完整地输出为 HTML 及 RTF 文件。
Ø 保持本地程序的更新历史,易于在需要的时候恢复原状。
(2)代码援助(Code Assistants)
Ø 自动完成 Java 和 JSP 的编码。
Ø Java 和 JSP 的参数提示。
Ø Java 和 JSP 的标识符提示。
Ø 查找声明,并快速跳转到声明所属的变量、方法或类。
Ø 类浏览器。
(3)项目管理(Project Management)
Ø 智能文件夹,当系统文件发生改变的时候,自动同步更新。
Ø 可以运行 Applications、Applets 以及应用服务器。
(4)J2EE
Ø 直接预览 Servlets 及 JSP。
Ø 自动完成 JSP 标签,支持 HTML 及自定义 JSP 标签。
(5)其他
Ø 支持集成 ANT。
Ø 支持集成 JUnit。
Ø 定制工具栏及快捷方式。
Ø 支持创建自定义工具。
Ø Javadoc 浏览器。
总的来说,Gel 虽然小巧,但速度奇快,更重要的是它拥有许多大型 Java IDE 的完整功
能。本书附录,将详细介绍 Gel 的设置及如何利用 Gel 来开发 JSP 程序。
1.4 第一个 Java 程序
前面我们讲解了 J2SE 5.0 的安装及环境变量的设置,现在我们就编写一个很简单的 Java
24. 应用程序 Application 来结束本章的学习。
在 EditPlus 或 UltraEdit 中输入如下代码(chap01Fig1.4WelcomeJavaChart.java):
1: // Fig. 1.4: WelcomeJavaChart.java
2: // 第一个 Java 程序
3:
4: public class WelcomeJavaChart{
5: // Java 主程序入口
6: public static void main(String args[]){
7: System.out.println("**************************************");
8: System.out.println("欢迎来到<<精通 Java Web 动态图表编程>>的世界! ");
9: System.out.println("**************************************");
10:
11: } //主程序结束
12:
13: } // end class WelcomeJavaChart
该源程序仅仅在命令窗口显示三条文本。可以用传统的方法,在 DOS 下对该文件进行
编译及运行,也可以在 EditPlus 及 UltraEdit 中进行。
将 WelcomeJavaChart.java 拷贝到 D:webchartchap01Fig1.4 子目录下,运行如下命令:
D:webchartchap01Fig1.4>javac WelcomeJavaChart.java
D:webchartchap01Fig1.4>java WelcomeJavaChart
编译及运行结果如图 1.10 所示。
在 UltraEdit 中,编译和运行的方法是运行【Advanced】→【编译 JAVA】→【运行 JAVA】
工具,如果全部设置正确,就可以看到如图 1.11 所示的结果。
图 1.10 WelcomeJavaChart.java 的运行结果
25. 图 1.11 UltraEdit 下 WelcomeJavaChart.java 的运行效果
在 EditPlus 中,编译和运行的方法是运行【Tools】→【编译 JAVA】→【运行 JAVA】工
具,如果全部设置正确,就可以看到如图 1.12 所示的结果。
26. 图 1.12 EditPlus 下的 WelcomeJavaChart.java 的运行结果
1.5 本章小结
本章主要介绍 Java 的历史及其运行机制、技术特点,讲解了各种 Java 开发环境的搭建,
包括 JDK 的下载、安装和环境变量的设置,在 EditPlus 和 UltraEdit 中如何设置编译及运行。
此外,简要介绍了两款目前国外流行的 Java IDE 开发环境:Eclipse 和 Gel。最后用一个简单
的 Java Application 来测试搭建的 Java 开发环境是否成功。
只有在正确搭建 Java 开发环境的基础上,才能顺利地搭建 JSP 服务器。下面学习 Java
Applet 的编写和调试,让我们一起进入 Web 图表编程的精彩世界!
第 2 章 Java Applet 与绘图基础
Java 最初在因特网上流行,很大程度上归功于 Java Applet。Java 对图形处理的应用最早
就是从 Applet 开始的,对于希望掌握 Web 动态图表编程的读者来说,从 Applet 着手学习是
一个很好的途径。理解 Applet 的绘图基础,就可以顺利地过渡到如何运用 JSP 来进行图表的
绘制。
2.1 Java Applet 概述
Java 共有两种类型的程序。一种称为 Java Application,如第 1 章 1.4 节所示的 Welcome
27. JSPChart.java。本章介绍另外一种 Java 程序,这类程序称为 Java Applet。Java Applet 是一种
可以嵌入 HTML 文档(即 Web 页)中并可以被执行的 Java 程序。支持 Java 的浏览器,在浏
览一个包含有 Java Applet 的 Web 页面时,该 Applet 就被下载到该浏览器中,并被 JVM 解释
执行。
目前,支持 Java2 的浏览器有:Mozilla、Netscape7 及其以上版本、Opera 和 FireFox。微
软的 Internet Explorer 或者早期的 Netscape 版本,需要安装 Java 的插件(Plugin)才可以正
常浏览 Java Applet 的 Web 页面。
提示:如果读者的计算机中已经安装了 J2SE 5.0 开发环境,那么 IE 就不需要再安装插
件。该插件是作为 J2SE 5.0 的一部分(JRE 5.0)安装在浏览器上的。
我们先来看 J2SE 5.0 中提供的一些 Applet 范例,展示了 Applet 的强大功能。其中每个
Applet 还提供了源代码。通过阅读这些源代码,可以了解 Java 最新的、令人激动的新特性及
其用法。
J2SE 5.0 提供的范例位于 J2SE 5.0 安装目录中的 demo 子目录下。在 MS Windows 中,
该范例的默认安装位置是:C:jdk1.5.0demoapplets;在 Unix/Linux/Mac OS 中,该范例的默
认安装位置是:/usr/local/jdk1.5.0/demo/applets。
在 applets 子目录下又包含了一些子目录,每一个子目录对应着一个相应的 Java Applet,
每个 Applet 展示了不同的功能。表 2.1 列出了这些范例及其功能。
表 2.1 applets 目录中的范例
范 例 说 明
Animator 演示了四种不同类型的动画
ArcTest 演示了圆弧的绘制,可以与该 Applet 交互并改变圆弧的显示属性
BarChart 演示了一个简单的条形图
Blink 演示了以不同颜色显示并闪烁的文本
CardTest 演示了几个 GUI 的部件及布局方式
Clock 演示了一个可以显示当前日期和时间的时钟
演示了用图形抖动(dithering)技术进行图形绘制,该技术实现的是从一种颜色逐渐转
DitherTest
变成另一种颜色(渐变色)
DrawTest 演示了使用鼠标在 applet 上,用不同的颜色绘制线段和点
Fractal 演示了绘制一个不规则图形
GraphicsTest 绘制不同的图形,以演示 Java 对图形的处理能力
绘制一个通过直线连接,由许多个节点(用矩形表示)组成的图形。可以拖动其中一个
GraphLayout
节点,观察其他节点是如何重新调整它们位置的情形,以演示复杂的图形交互
演示了一个有热点的图像。当鼠标移动到热点区域,该区域将会高亮显示,并在
ImageMap appletviewer(或者浏览器)的左下角(状态栏)显示一条消息。当鼠标定位在图像中人像
嘴上的时候,会听见 applet 说“hi”
JumpingBox 在屏幕上随机移动一个矩形,可以试一试用鼠标去捕获它
演示了几个不同化学分子结构的三维视图,可以拖动鼠标从不同的角度来观察这些化学
MoleculeViewer
分子的结构
NervousText 绘制在屏幕上跳动的文本
SimpleGraph 绘制一条复杂的曲线
28. 比较三种不同的排序技术。执行该 Applet 时,会出现三个 appletviewer 窗口。单击其中
SortDemo
任意一个窗口,都会开始排序,不同的排序技术所花费的时间是不同的
SpreadSheet 演示了一个简单的,由行和列组成的电子表格
TicTacToe 演示了一个叫做 TicTacToe 的游戏,由计算机和用户互弈
WireFrame 演示了四个由许多线段组成的三维图形,分别是立方体、恐龙、直升飞机和军舰
运行上述例程的方法有两种。我们以运行表 2.1 中所讲述的 ArcTest Applet 程序为例:
(1)用 Java 自带的 Applet 容器 appletview.exe 来运行上述例程。
在【命令提示符】下,输入如下命令:
C:Documents and SettingsJKZhong>cd C:jdk1.5.0demoapplets ArcTest
C:jdk1.5.0demoappletsArcTest>appletviewer example1.html
(2)会看到 ArcTest 的运行结果,再进行如下操作,会看到如图 2.1 所示的结果。
Ø 在第一个文本框中输入 10,表示圆弧的起始角度。
Ø 在第二个文本框中输入 145,表示圆弧的终止角度。
Ø 按钮【Fill】表示绘制并填充这个圆弧,按钮【Draw】表示仅仅绘制圆弧。单击【Fill】
按钮可以看到,绘制的结果是一个从 10 开始到 145 结束的实心圆弧。
(3)直接用浏览器打开 C:jdk1.5.0demoappletsArcTest 子目录下的 example1.html 文
档,就可以运行上述 Java Applet 程序,这里以微软的 IE 为例。
Ø 如果与笔者相同,使用微软 Windows XP SP2 下的 IE,可能会看到如图 2.2 所示的结
果。IE 可能会有这样一个提示: “为帮助保护您的安全,Internet Explorer 已经限制此
文件显示可能访问您的计算机的活动内容。单击此处查看选项…” 。
Ø 这时无法看到 Java Applet 的运行结果,因为被 IE 屏蔽了。解决的方法是,在 IE 的提
示下单击鼠标右键,在弹出的菜单中选择【允许阻止的内容】 。
Ø 然后会弹出一个【安全警告】对话框,单击【是】按钮,即可看到运行如图 2.2 所示
的 Java Applet 结果。
图 2.1 appltviewer 的运行结果 图 2.2 ArcTest Applet 的运行结果
提示:如果 appletviewer 命令不能工作,或者收到一条消息,表示没有找到 appletviewer
命令,则计算机可能没有正确地设置 PATH 的环境变量。 读者需要按照 1.2.2 节讲述的方法重
新设置 PATH 变量,修改 PATH 变量后,需要重新启动计算机。
29. 2.2 Java Applet 工作流程
2.2.1 组件与容器
一个组件 (Component)代表可以在屏幕上显示出来的一个图形实例, 也就是 Component
类的任意一个子类的对象。图 2.3 是以 Component 类为基础类的继承关系结构图,图中箭头
所指向的类为超类。
从图 2.3 可以看到,JApplet、JFrame、Dialog 等就是一个组件,它们都属于 Component
类的子类。所有从 Container 派生出来的类都可以包含由 Component 类派生出来的任意一个
类的对象,所以我们称之为容器(Container) 。又因为 Container 类是 Component 类的一个子
类,所以任意一个容器对象同时又是一个 Component 对象, 因此一个容器可以包含其他容器。
下面以 Panel 类对象来说明这个关系。我们把一些图形实例如矩形、椭圆等放置在一个 Panel
类的对象——panelA 中, 再把另外一些 Component 对象如菜单、 按钮等放置在另外一个 Panel
类的对象——panelB 中,最后把 panelA 和 panelB 放置在另外一个 Panel 类的对象——panelC
中。这里的例外是,Windows 类及其子类的对象,不能包含在其他容器中,否则,系统会抛
出一个异常。
Component
(抽象类)
Container
(抽象类) JComponent
(Swing 组件)
Panel Window
(旧式容器) (无边框或标题栏)
Applet Frame
(旧式 Applet 类) (旧式框架类)
Dialog
(旧式对话框类)
JWindow
JApplets JFrame JDialog
(无边框或标题栏)
Applet 的基类 应用程序 对话框的基类
窗口的基类
图 2.3 以 Component 类为基础类的继承关系结构图
JComponent 类是所有在一个窗口中作为 GUI 一部分使用的 Swing 组件的基类。因为
JComponent 也是从 Container 类继承下来的,故此所有的 Swing 组件也是容器。
JApplet 类是所有 Swing Applet 类对象的基类,它由 Component 派生的 Container 类派生
出来。因此,一个 Applet 程序就从 Container 和 Component 类继承所有的方法。此外,它也
继承了旧的 Applet 类的方法。
这里需要注意以下几点:
Ø JApplet 类、JFrame 类、JDialog 类以及 JComponent 类,包含在 javax.swing 包中。
Ø Applet 类包含在 java.applet 包中。
Ø 除此之外的类,包含在 java.awt 包中。
java.applet 包很小,它只包含这一个类和三个相关的接口,我们很少直接使用该包中的
方法。在 JApplet 类中,对旧的 Applet 类的方法进行了扩充和改进(旧类与 javax.swing
包中的 GUI 组件不完全兼容) 。所以本书所有相关的 Applet 类都扩展于 JApplet 类。
30. 2.2.2 Applet 的编译与执行
如同 Java Application 程序一样, 在执行前必须对 Applet 类的源程序进行编译, 编译的方
法与 1.4 节讲述的方法相同。
Applet 被嵌入到 HTML 页面中, 并由 Applet 容器(appeltviewer 或者 Web 浏览器)执行。
Applet 的运行由浏览器控制, 不由 Applet 中的代码控制。 当浏览器载入包含有 Applet 的 Web
页面时,它将生成一个 Applet 类的对象,然后利用 Applet 类对象的五个方法控制 Applet 的
执行。这五个方法都是 public 类型,不返回任何结果,以及不需要任何参数的方法。
表 2.2 列出了 5 个方法及其执行的相应功能。
表 2.2 Applet 默认的 5 个方法
方 法 说 明
启动 Applet。浏览器总是调用 Applet 类的默认构造器生成对象,然后调用 init()方法进行初始
void init()
化。一般在这个方法中生成 Applet 运行所需的对象并初始化 Applet 类的所有数据成员
方法由浏览器调用,启动或者重新启动 Applet。当 Applet 第一次启动时,start()方法将紧跟
void start() 在 init()方法后被浏览器调用。如果用户离开当前的 HTML 页面后,在重新返回到当前 HTML
页面时,Start()方法也将被调用。start()方法一般用来启动 applet 需要的任何附加线程
在 init()方法执行结束,
start()方法启动后,就调用此画图方法。另外,每次需要重新绘制 Applet
void paint( Graphics g ) 时,也将调用此方法。本方法的典型应用,包括使用 Applet 容器传递给 paint 方法的 Graphics
对象 g 画图
当用户离开包含有该 Applet 的 HTML 页面时,浏览器调用此方法。stop()方法被调用后,将
void stop()
立即停止所有在 start()方法中启动的操作
在终止 Applet 运行时,调用 destroy()方法,以便释放 Applet 占用的,由本地操作系统管理的
void destroy()
任何系统资源。此方法执行之前,总是先调用 stop()方法
我们编写的 Applet 程序都将继承上述 5 种默认的方法。对于每个 Applet,方法调用的顺
序总是 init、start 和 paint,这就保证了每个 Applet 开始执行时都将调用这些方法。但是,并
非每个 Applet 都需要调用 5 种方法。我们可以重载上述的 5 种方法,也可以重载其中的某种
方法,以便 Applet 实现我们所设计的方法。
浏览器通过包含有 Applet 的 HTML 页面来运行 Applet 程序。 那么,在执行 Applet 之前,
首先要创建 HTML 文档。
31. 2.2.3 包含 Applet 的 HTML
通常,HTML 文档以“.html”或者“htm”的扩展名结尾。一个在 HTML 页面中包含有
Applet 的 HTML 文档,必须指明 Applet 容器应该装入和执行哪一个 Applet。
下面是一个完整的包含 Applet 的 HTML 源代码:
1: <!DOCTYPE HTML PUBLIC "//W3C//DTD HTML 4.0 Transitional//EN">
2: <HTML>
3: <HEAD>
4: <TITLE>包含有 Applet 的 HTML 页面</TITLE>
5: </HEAD>
6:
7: <BODY>
8: <APPLET CODE = "MyAppletName.class"
9: WIDTH = "Applet_width_in_pixels"
10: HEIGHT = "Applet_height_in_pixels" >
11: </APPLET>
12: </BODY>
13: </HTML>
我们可以看到,代码第 8 行~第 11 行是隶属于<applet>和</applet>标记之间的内容,也
是一个包含 Applet 的 HTML 页面所需的最少内容,其余部分都是标准的 HTML 标记。
Applet 标记内的“CODE”属性,表示该 Applet 的.class 文件,它假设 Applet 位于包含
该 Applet 的网页所在的相同目录下。 本例指明 Applet 容器, 载入一个名为 “MyApplet Name”
的 Applet 字节码文件。如果.class 文件和 HTML 文件不在同一目录下,则需要使用一个
CODEBASE 属性, 它拥有一个 URL 值, 指明 applet 源代码的位置,
URL 可以是绝对值 (以 http://
开头) ,也可以是相对值。属性“WIDTH”表示该 Applet 在网页上显示的宽度,用像素表示。属
性“HEIGHT”表示该 Applet 在网页上显示的高度,也用像素表示。
了解前面我们介绍的 Applet 的相关知识,就可以编写一些 Applet 程序了。
2.3 绘制文本(字符串)
现在,让我们来开发一些 Applet。首先介绍一个简单的 Applet 程序——DrawString
Applet.java,就是在 Applet 上绘制一段文本(字符串) “欢迎来到《精通 Java Web 动态图表
编程》的世界!。 ”
DrawStringApplet.java 的源程序清单如下(chap02Fig2.3Fig2.3_01):
1: // Fig. 2.3_01: DrawStringApplet.java
2: // 第一个 Java Applet 程序, 绘制文本(字符串)
3:
4: // 引入相关的包
5: import java.awt.Graphics; // 引入 Graphics 类
6: import javax.swing.JApplet; // 引入 JApplet 类
7:
8: public class DrawStringApplet extends JApplet
9: {
10:
11: // 在 applet 上绘制文本
12: public void paint(Graphics g)
13: {
14: // 调用父类的 paint 方法
15: super.paint(g);
16:
17: g.drawString("欢迎来到 《精通 Java Web 动态图表编程》的世界!",
25,
25);
32. 18:
19: } // paint 方法结束
20:
21: } // DrawStringApplet 类结束
提示:本书后面的例程将不再列出完整的源代码清单,请读者从 www.broadview.com.cn 网
站下载本书配套代码,查看相关目录下完整的源代码清单。
包含这个 Applet 的 web 页面文件 DrawStringApplet.html 的源程序清单如下:
1: <!DOCTYPE HTML PUBLIC "//W3C//DTD HTML 4.0 Transitional//EN">
2: <HTML>
3: <BODY>
4: <APPLET CODE "DrawStringApplet.class" WIDTH "320 HEIGHT "45"
= = " =
>
5: </APPLET>
6: </BODY>
7: </HTML>
提示:本书所有的 Java Applet 都将使用与本例相类似的 HTML 文档。对于不同的 Java
Applet,读者只需要修改上述代码第四行的内容, 重新设置“CODE”、
“WIDTH” “HEIGHT”
和
的属性值即可。
图 2.4 展示了名为 DrawStringApplet 的 Applet 在四个不同的 Applet 容器中的运行结果。
分别是 Appletviewer、
Netscape Web 浏览器(现在更名为 Mozilla) Opera,
、 以及微软的 Internet
Explorer Web 浏览器。
该程序说明了 Java 的几个重要特性。程序第 17 行完成的实际工作,即在屏幕上绘制一行文
本“欢迎来到《精通 Java Web 动态图表编程》的世界!。下面我们逐行来分析本程序。
”
程序第 1 行~第 2 行:
// Fig. 2.3: DrawStringApplet.java
// 第一个 Java Applet 程序, 绘制文本(字符串)
是注释。第 1 行说明例程的编号,以及源程序的文件名。第 2 行描述程序所实现的功能。
33. x 轴 appletviewer 窗口
y 轴
applet 菜单
绘制区左上角是(0,0) ,绘
制区边缘在状态栏上 x 坐标从 状态栏显示 applet
左向右递增,y 坐标从上向下 当前的运行状态
递增
文本在该处的坐
标是(25,25)
绘制区域在左上角
坐标是(25,25)
状态栏
绘制区域在左上角
坐标是(25,25)
绘制区域在左上角
坐标是(25,25)
状态栏
图 2.4 DrawStringApplet 在四个不同的 Applet 容器中的运行结果
程序第 5 行:
import java.awt.Graphics; // 引入 Graphics 类
是一个 import 声明, 表明 Applet 使用 java.awt 包中的 Graphics 类。Java 包含了很多预定
义的类,并按包(类的集合)的形式进行分组。Graphics 类是一个具备图形处理能力的类,
可以让 Java Applet 能够绘制直线、文本、矩形及椭圆形等图形对象。
程序第 6 行:
import javax.swing.JApplet; // 引入 JApplet 类
也是一个 import 声明,表明 applet 使用 javax.swing 包中的 JApplet 类。在 Java 2 中创建
一个 Applet 时,必须引进 JApplet 类。
程序第 8 行:
public class DrawStringApplet extends Japplet
声明了一个名为 DrawStringApplet 的公有 (public) 并继承了 javax.swing 包中的 JApplet
类,
类。该类的主体从程序第 9 行的左花括号“{”开始,到程序第 21 行的右花括号“}”结束。
在继承关系中,JApplet 类称为超类(也称为基类或父类) ,DrawStringApplet 被称为子类或派
生类。因为,DrawStringApplet 继承了 JApplet 类,所以,它不仅具有 JApplet 类的所有属性
34. 和方法,而且还可以增加新的方法和属性,以及扩展被继承的方法。
程序第 12 行:
public void paint(Graphics g)
声明 Java Applet 的 paint 方法。前面我们提到的 paint 方法是 Java Applet 容器在载入 Applet
时,自动调用三个方法中的一个(其他两个是 init 和 start 方法) 。如果我们不在 Applet 中重
新定义该方法,那么 Applet 容器将调用继承下来的默认超类的 paint 方法。因为,默认超类
(JApplet)的 init、start 和 paint 方法为空(指明该方法的方法体中没有任何语句) ,也就是
说,超类的 paint 方法不会在 Applet 上绘制任何东西,所以在屏幕上也就不会有任何显示。
void 表示 paint 方法执行完后,不返回任何结果。paint 方法需要一个 Graphics 类的对象
g(对象也称为“类实例”或者“实例”。paint 方法使用 Graphics 类的对象 g 在 applet 上绘
)
制各种图像对象, 如文本及各种几何图形等。 Graphics 类的对象 g 的创建由 Applet 容器负责。
为了实现在屏幕上绘制出一段文本,程序第 13 行~19 行,重载(重新定义)了超类的
paint 方法。
程序第 15 行:
super.paint(g);
调用超类 JApplet 的 paint 方法。该语句是 Java Applet 程序中 paint 方法体的第一个语句。
早期的 Java Applet 在没有该语句的情况下仍然可以正常运行, 但在一个拥有众多绘图组件和
GUI 组件的复杂 Java Applet 中, 忽略该语句可能会导致严重的错误。 所以, 在编写 Java Applet
程序的时候,一定在 paint 方法的第一行设置这条语句,这是一个很好的编程习惯。
程序第 17 行:
g.drawString(“欢迎来到《精通 Java Web 动态图表编程》的世界!”, 25, 25);
通过 Graphics 类的对象 g 来调用该类的 drawString 方法,以实现在 Applet 上绘制文本的
功能。drawString 方法的具体使用如表 2.3 所示。
表 2.3 drawString 方法
方法 public abstract void drawString(String str, int x, int y)
说明 用当前的字体和颜色,在指定的坐标(x,y)处,绘制字符串 str 的内容
调用的具体方法是 Graphics 类的对象名称(这里是 g)加上一个点操作符“.” ,再加入
所调用的方法名称(这里是 drawString) 。方法名后面跟着一对括号,括号内包含有执行该方
法所需的参数。
drawString 方法需要三个参数,第一个是 String 类的字符串参数,表示要绘制的文本。
最后两个是 int 类型的整数型参数,表示要绘制文本的第一个字符左下角所在的位置,该位
置用 Java 的平面坐标系来表示。
图 2.5 说明了 Java 坐标系。坐标原点位于左上角,以像素为单位。像素是计算机屏幕上
最小的显示单位。在 Java 的坐标系中,第一个是 x 坐标,表示当前位置为水平方向,距离坐
标原点 x 个像素;第二个是 y 坐标,表示当前位置为垂直方向,距离坐标原点 y 个像素。在
Appletviewer 中,坐标原点(0,0)正好位于 Applet 菜单的下方。在 Web 浏览器中,原点(0,
0)位于 Applet 执行的矩形区域的左上角(如图 2.5 所示) 。
35. 坐标原点(0,0)
25 +X
X 轴
25
欢迎来到《精
(x,y)
+Y
Y 轴
图 2.5 Java 坐标系
计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如,计算机显示器的
分辨率是 800´600,表示计算机屏幕上的每一行由 800 个点组成,共有 600 行,整个计算机
屏幕共有 480 000 个像素。现在的计算机可以支持更高的分辨率,也就是说,屏幕上可以显
示更多的像素。Java Applet 在屏幕上的大小,依赖于屏幕的大小与分辨率。对于大小相同的
屏幕来说,分辨率越高,Java Applet 在屏幕上的显示就越小,这是因为屏幕上的像素更多了。
程序第 17 行,将在坐标(25,25)上绘制“欢迎来到《精通 Java Web 动态图表编程》
的世界!”如图 2.4、图 2.5 所示。
Java Applet 可以在 paint 方法中多次调用 drawString 方法,在屏幕的任意位置绘制文本。
我们就可以利用这种方法来显示多行文本。
DrawMultiStringApplet.java 演示了如何绘制多行文本(chap02Fig2.3Fig2.3_02)
。通过
调用该目录下的 DrawMultiStringApplet.html 的运行结果如图 2.6 所示。
坐标(25,25)
坐标(25,40)
图 2.6 在 Java Applet 上绘制多行文本
本例同第一个 Java Applet 程序相比,仅仅增加了第 18 行。图 2.7 所示的两行文本之所
以能够左对齐, 就是因为第 17 行和第 18 行的 drawString 方法, 都使用了相同的 x 坐标(25)。
此外,两者使用不同的 y 坐标(第 17 行是 25,第 18 行是 40)。因此在 Applet 相同的水平
位置,不同的垂直位置上显示文本,也就实现了左对齐的功能了。如果把第 17 行和第 18 行
的内容相互交换,则运行的结果也是相同的,这说明文本的位置由其坐标决定。
绘制文本时,不能通过换行符(n)来实现文本换行的功能。如 DrawMultiStringApplet2.
java(chap02Fig2.3Fig2.3_03)和 DrawStringApplet.java 相比,主要是第 17 行语句不同,如下
所示:
g.drawString(“欢迎来到《精通 Java Web 动态图表编程》的世界!n 不用不知道,Java
真奇妙!”, 25, 25);
即使绘制的文本中包含有换行符(n),运行结果如图 2.7 所示,字符串并没有分行显示。
36. 图 2.7 用n 绘制多行文本
提示: 在某些 Java 版本中,运行结果会在字符串中的换行符位置处显示一个黑色小方框,
表示 drawString 方法不能识别该字符。
2.4 绘制线段
如果要在 Java Applet 中绘制一段直线,就需要调用 Graphics 类的 drawLine 方法。 先来
看 drawLine 的用法,如表 2.4 所示。
表 2.4 drawLine 方法
方法 public abstract void drawLine(int x1, int y1, int x2, int y2)
说明 用当前颜色在端点 1(x1,y1)和端点 2(x2,y2)之间绘制一条直线
drawLine 方法需要四个参数,表示该线段的两个端点。第一个端点的 x 坐标和 y 坐标分
别由第 x1、y1 个参数决定;第二个端点的 x 坐标和 y 坐标分别由第 x2、y2 个参数决定。所
有的坐标值都相对于该 Applet 的左上角坐标(0,0)。drawLine 方法就是在这两个端点之间
绘制一条直线。
程序 drawLineApplet.java(chap02Fig2.4)绘制了 11 条直线、1 个三角形和 1 个矩形。源
程序的运行结果如图 2.8 所示。
坐标(160,10)
坐标(90,10)
坐标(10,10) 坐标(230,10)
坐标(90,110)
坐标(330,10)
坐标(110,110)
坐标(210,110) 坐标(230,110) 坐标(330,110)
图 2.8 drawLineApplet.java 的运行结果
程序第 5 行:
import java.awt.Graphics; // 引入 Graphics 类
导入 Applet 所需的 Graphics 类(来自 java.awt 包)实际上,
。 如果总是使用完整的 Graphics
类名(java.awt.Graphics),即包含完整的包名和类名,就不需要第 5 行的 import 语句了。也
就是说,如果没有第 5 条语句,那么第 12 行就可以改写成如下形式:
37. public void paint(java.awt.Graphics g)
程序第 6 行:
import javax.swing.*; // 引入 javax.swing 包中所有的类
这里告诉编译器,Applet 可以使用 javax.swing 包中所有的类。星号(*)表示 javax.swing
包中所有的类都可以被编译器所使用。不过,在程序开始运行时,它并不会将该包中所有的
类都载入内存中,而只是装载程序使用的那些类。本例仅加载了 JApplet 类。
程序第 15 行:
super.paint(g);
调用超类 JApplet 的 paint 方法。编写 Java Applet 程序时,在 paint 方法的第一行设置这
条语句。
程序第 18 行~第 21 行:
for (int i = 1; i <= 11 ; i++ )
{
g.drawLine(10, 10, 90, i * 10 );
}
运行了一个循环语句,调用了 11 次 drawLine 方法,在 Applet 上绘制了 11 条线段。这
11 条线段第 1 个端点的坐标都是相同的,即(10,10) ,第 2 个端点坐标的 x 坐标也是完全
相同的。只是 y 坐标不同, 每循环一次,y 坐标依次增加 10 像素。该循环的运行结果如图 2.8
中最左边的图形。
程序第 24 行~第 26 行:
g.drawLine(160, 10, 110, 110);
g.drawLine(160, 10, 210, 110);
g.drawLine(110, 110, 210, 110);
直接调用 3 次 drawLine 方法,在 Applet 上绘制了由 3 条线段而组成的一个三角形。这
个三角形的三个端点坐标分别是(160,10)(110,110)和(210,110)
、 。用 drawLine 方法
在两个端点之间绘制一条直线,运行结果如图 2.8 中的三角形。
程序第 29 行~第 32 行:
g.drawLine(230, 10, 230, 110);
g.drawLine(230, 10, 330, 10);
g.drawLine(330, 10, 330, 110);
g.drawLine(230, 110, 330, 110);
直接调用 4 次 drawLine 方法,在 Applet 上绘制了由 4 条线段组成的一个矩形。这个矩
形的 4 个端点坐标分别是: (230,10)(330,10)(330,110)和(230,110)
、 、 。用 drawLine
方法绘制该矩形的四条边,运行结果如图 2.8 中右边的矩形。
38. 2.5 色彩管理
早期的电脑系统是没有色彩管理这个概念的, 直到 90 年代苹果电脑推出了 ColorSync 1.0
色彩管理,它局限于苹果电脑之间的色彩控制。1993 年国际色彩联盟(Interational Color
Consortium)成立,制定了开放式色彩管理规则──ICC,使色彩在不同品牌的电脑输出/输
入设备之间能够互相沟通,产生一致的色彩效果。随后,苹果电脑系统、微软的 Windows
系统、Sun 微电脑系统等相继支持 ICC 规则。
2.5.1 色彩基础
当我们从事设计的时候,最想了解的是如何有效地使用色彩。例如,使用什么色彩会产
生什么效果,用什么色彩代表什么性格,色彩如何搭配才美观,等等。要了解这些内容,首
先要认识色彩,知道色彩具有什么物理特性,以及色彩是如何形成的。
1.什么是色彩
我们生活在一个多彩的世界里。白天,在阳光的照耀下,各种色彩争奇斗艳,并随着照
射光的改变而变化无穷。但是,每当黄昏,大地上的景物无论多么鲜艳,都将被夜幕吞没。
在漆黑的夜晚,我们不但看不到物体的颜色,甚至连物体的外形也分辨不清。同样,在暗室
里,我们什么色彩也感觉不到。这些事实告诉我们,没有光就没有色,光是人们感知色彩的
必要条件。色彩来源于光,所以,光是色彩的源泉,色彩是光的表现。要了解色彩产生的原
理,必须对光做进一步的了解。
光的物理性质由它的波长和能量来决定。波长决定了光的颜色,能量决定了光的强度。
光映像到我们的眼睛时,波长不同决定了光的色相不同。波长相同能量不同,则决定了色彩
明暗的不同。
只有波长 380nm~780nm(1nm=10-6 mm)光的辐射才能引起人们的视觉感知,这段光波
叫做可见光。我们看到的色彩,事实上是以光为媒体的一种感觉。色彩是人在接受光的刺激
后,视网膜的兴奋传送到大脑中枢而产生的印象。
英国科学家牛顿在 1666 年发现,把太阳光经过三棱镜折射,然后投射到白色屏幕上,会
显出一条像彩虹一样美丽的色光带谱,从红色开始,依次是橙、黄、绿、青、蓝、紫七色,
如图 2.9 所示。
这条依次排列的彩色光带称为光谱。这种被分解过的色
光,即使再通过三棱镜也不会分解为其他的色光,我们把光
谱中不能再分解的色光叫做单色光。由单色光混合而成的光
叫做复色光。自然界的太阳光,白炽灯和日光灯发出的光都 图 2.9 光谱
是复色光。
2.色彩的三属性
我们不仅观察物体的色彩,同时还会注意到形状、面积、体积,以致该物体的功能和所
处的环境。这些对色彩的感觉都会产生影响。为了寻找规律,人们抽出纯粹色知觉的要素,
认为构成色彩的基本要素是色相、明度、纯度,这就是色彩的三属性。
Ø 色相(Hue)
色相指色的相貌与名称。色轮是表示最基本色相关系的色表。色轮上
90 度角内的几种色彩称作同类色,也叫做近邻色或姐妹色;90 角以外的色
图 2.10 色相
39. 彩称为对比色。色轮上相对位置的色叫做补色,也称为相反色,如图 2.10 所示。
Ø 明度(Value 或 Brightness)
人眼之所以能够看到物体的明暗,是因为物体所反射色光的光量(热量)存在差异。光
量越多,明度越高,反之明度越低。色料的色彩明度,取决于混色中白色和黑色含量的多少,
如图 2.11 所示。
Ø 纯度(Chroma)
所谓色彩的纯度,是指色彩鲜艳与混浊的程度,也称为彩度。色轮上各颜色都是纯色,
纯度最高。色料的混合中,越混合,色彩的纯度越低,如图 2.12 所示。
图 2.11 明度变化 图 2.12 纯度变化
3.混色理论
Ø 原色
无法用其他色彩混合得到的基本色彩称为原色。原色按照一定比例混合可以得到各种色
彩。究竟原色有多少种,又是哪几种颜色?历史上不同的学者有不同的说法,但基本上分为
三原色说和四原色说。
色彩的混色有两种类型:加法混色和减法混色。
Ø 加法混色
色光三原色(红、绿、蓝)按照一定的比例混合可以得到各种色光。三原色光等量混合
可以得到白色。色光混色和色料混色刚好相反,色光混色是越混合越明亮,所以称为加法混
色。我们熟悉的电视机和电脑的 CRT 显示器产生的色彩方式就属于加法混色,如图 2.13A 所
示。
Ø 减法混色
色料三原色(品红、黄、青蓝)按照一定的比例混合可以得到各种色彩。理论上三原色
等量混合可以得到黑色。因为色料越混合越灰暗,所以称为减法混色。水彩、油画、印刷等,
它们产生各种颜色的方法都是减法混色,如图 2.13B 所示。
A:加法混色 B:减法混色
图 2.13 色彩的混合
这两种混色方法,通过对相对应的色彩取反操作,就可以相互转换了。
40. 4.色彩空间及色彩模型
“色彩空间”一词源于英语“Color Space” ,也称做“色域” 。实际上就是各种色彩的集
合,色彩的种类越多,色彩空间越大,能够表现的色彩范围(即色域)越广。对于具体的图
像设备而言,其色彩空间就是它所能表现色彩的总和。
自然界中的色彩千变万化,我们要准确地表示色彩空间就要使用到色彩模型。人们建立
了多种色彩模型,以一维、二维、三维甚至四维空间坐标来规范这些色彩。
最常用的色彩模型有: HSB、
RGB、 CMYK 以及 CIE Lab 等色彩模型。 其中 RGB、
CMYK
是惟一两种专门面向数码设计和出版印刷的色彩模型。这里我们介绍 RGB、CMYK 色彩模
型,认识这两个色彩模型,有助于我们在设计中准确地把握色彩。
所谓 RGB 就是:红(Red) 、绿(Green) 、蓝(Blue)三种色光原色。RGB 色彩模型的
混色属于加法混色。每种原色的数值越高,色彩越明亮。R、G、B 都为 0 时是黑色,都为
255 时是白色。
RGB 是电脑设计中最直接的色彩表示方法。电脑中的 24 位真彩图像,就是采用 RGB
模型来精确记录色彩的。所以,在电脑中利用 RGB 数值可以精确取得某种颜色。
R、G、B 数值和色彩的三属性没有直接的联系,不能揭示色彩之间的关系。所以在进行
配色设计时,RGB 模型就不是那么适用了。
RGB 色彩模型又有 AdobeRGB、AppleRGB、sRGB 等几种,这些 RGB 色彩模型大多与
显示设备、输入设备(数码相机、扫描仪)相关联。
Ø“sRGB”是所谓的“标准 RGB 色彩模型” 。这种色彩空间由微软公司与惠普公司于
1997 年联合确立,被许多软件、硬件厂商所采用,逐步成为许多扫描仪、低档打印机
和软件的默认色彩空间。同样采用 sRGB 色彩空间的设备之间,可以实现色彩相互模
拟,但却是通过牺牲色彩范围来实现各种设备之间色彩的一致性的,这是所有 RGB
色彩空间中最狭窄的一个。
Ø“Apple RGB”是苹果公司早期为苹果显示器制定的色彩模式。 其色彩范围并不比 sRGB
大多少。这种显示器已经很少使用,这一标准已逐步被淘汰。
Ø“Adobe RGB(1998) ”由 Adobe 公司制定。其最早使用在 Photoshop 5.x 中,被称为
SMPTE240M。它具备非常大的色彩范围,绝大部分色彩又是设备可呈现的,这一色
彩模型全部包含了 CMYK 的色彩范围,为印刷输出提供了便利,可以更好地还原原
稿的色彩,在出版印刷领域得到了广泛应用。
Ø“ColorMatch RGB”是由 Radius 公司定义的色彩模型,与该公司的 Pressview 显示器
的本机色彩模型相符合。 “Wide Gamut RGB”是用纯谱色原色定义的色彩范围的 RGB
色彩空间。这种空间的色域包括了几乎所有的可见色,比典型的显示器所显示的色域
还要宽。但是,由于这一色彩范围中的很多色彩不能在 RGB 显示器或印刷上准确重
现,所以这一色彩模型并没有太大的实用价值。
RGB 只是光色的表示模型,在印刷行业中,使用另外一种色彩模型 CMYK。CMYK 分
别是青色(Cyan) 、品红(Magenta) 、黄色(Yellow) 、黑色(Black)三种油墨色。每一种颜
色都用百分比来表示,而不是 RGB 那样的 256 级度。
理论上将印刷三原色,即青色(Cyan) 、品红(Magenta) 、黄色(Yellow)混合之后,
应该可以将红绿蓝光全部吸收而得到纯正的黑色,只是现实生活中找不到这种光线吸收,反
射特性都十分完美的颜料,将三种颜色混合后还是会有些许光线反射出来,呈现暗灰色或深
褐色。事实上除了黑色外,用颜料三原色也无法混合出许多暗色系的颜色,为了弥补这个缺
点,在实际印刷的时候,额外加入黑色的颜料,以解决无法产生黑色的问题。因此就有所谓
CMYK 的色彩模式,K 表示黑色(Black) 。
41. 2.5.2 Java 的色彩管理
Java 以跨平台,与硬件无关的方式支持色彩管理。Java 的色彩管理功能来自于 java.awt
包中的 Color 类。Color 类允许在应用程序中指定自己需要的任意色彩,不用担心因计算机的
硬件设备所支持的绘制方式不同而引起的颜色差别。Java 支持 sRGB 色彩模型,将自动找到
最接近的颜色。
Java 对色彩的管理都被封装在 java.awt.Color 类中。
Color 类提供了对颜色控制的常量和方法。表 2.5 列出了 Color 类中部分预定义的颜色常
量及其 RGB 值。
表 2.5 部分 Color 颜色常量及其 RGB 值
颜色常量 颜 色 RGB 值
public final static Color ORANGE/orange 橙色 255, 200, 0
public final static Color PINK/pink 粉红色 255, 175, 175
public final static Color CYAN/cyan 青色 0, 255, 255
public final static Color MAGENTA/magenta 品红色 255, 0, 255
public final static Color YELLOW/yellow 黄色 255, 255, 0
public final static Color RED/red 红色 255, 0, 0
public final static Color BLACK/black 黑色 0, 0, 0
public final static Color WHITE/white 白色 255, 255, 255
public final static Color LIGHT_GRAY/lightGray 淡灰色 192, 192, 192
颜色常量的名称有两种写法,一种是小写,另一种是大写。我们建议采用大写的形式表
达 Java 的颜色常量,因为它们更符合常量的命名约定。
Color 类通过设置不同的三个原色:红、绿、蓝(RGB)的值而创建各种颜色。这三个
原色的合并值称为 RGB 值。RGB 中的每个值又可以表示为 0~255 范围内的某个整数,或者
表示为 0.0~1.0 之间的浮点数。RGB 中的 R 表示颜色中红色的数值,G 表示绿色的数值,而
B 表示蓝色的数值。数值越大,表示相应的色彩含量就越多。RBG 总共可以产生的颜色总数
为 256´256´256,即 167 77 2 16 种颜色。表 2.6 列出了 Color 的方法以及 Graphics 类中与之相
关的方法。
表 2.6 Color 的方法以及 Graphics 类中与之相关的方法
Color 的构造器及部分方法
public Color(int r, int g, int b) // Color class
创建一种基于红色、绿色和蓝色的颜色,每种颜色的表示方法为 0~255 之间的一个整数
public Color(float r, float g, float b) // Color class
创建一种基于红色、绿色和蓝色的颜色,每种颜色的表示方法为 0~1 之间的一个浮点数
public int getRed() // Color class
返回一个 0~255 之间的,表示 RGB 中红色的整数值
public int getGreen() // Color class
返回一个 0~255 之间的,表示 RGB 中绿色的整数值
public int getBlue() // Color class
返回一个 0~255 之间的,表示 RGB 中蓝色的整数值