第2章 图形报表开发基础
【本章导读】
本章讲述Java图形和报表技术的发展历史,并介绍了Java中利用AWT和Swing进行图形的编程实例,接下来简要介绍了当前常用的图形与报表技术,从而使读者对Java的图形报表技术有一个大致的了解。
2.1 图形与报表开发概述
自从早期Java语言出现到现在,图形和用户界面功能已取得了飞跃式的发展。Java2平台包含一个复杂的跨平台的用户界面体系结构,它包括众多的高级组件、一个先进、功能丰富且独立于设备的图形系统和许多多媒体扩展。
2.2 发展历史
在Java 2平台发行之前,AWT(Abstract Window Toolkit,抽象窗口工具包)是Java平台图形功能的范围。例如Swing等各种技术都是作为可选的扩展引入的。
在Java 2平台上,大部分扩展都可以在平台的核心找到一席之地,成为Java基础类(Java Foundation Classes,JFC)的一部分。JFC指的是包含在Java2平台内的一整套图形和用户界面技术,包括AWT和Swing等,其核心是Swing。AWT的最大缺点是在相同的Java应用程序在每个平台上都有不同的外观。
现在来看一下Swing,它使用AWT的一个子集来实现这个目标,这个子集包括基本画图操作和java.awt包中的某些类(包括Container、Window、Panel、Dialog和Frame)。Swing没有完全遵循“Java语言作为一个平台”的路线,而且它支持可插式Look-and-Feel(它很接近主题的概念,在linux社区中非常流行)。每一个Swing组件都有一个自己的功能模型和一个独立的外观(look-and-feel),这可以预先设置或在运行时更改。这样就成功地解决了AWT的最大缺点。
在Java 2平台之前,语言中的图形功能相当简单,仅限于单像素厚度的实线。少数几个几何图形(如椭圆、弧和多边形)和基本的画图功能。随着Java 2D API的出现,所有的一切都改变了。Java 2D API的核心是由java.awt.Graphics2D类提供的,该类是java.awt.Graphics的一个子类。API的其他部分由java.awt层次结构中的其他包提供,包括java.awt.color、java.awt.font和java.awt.geom。
2.3 AWT、Swing开发实例
首先,通过简单的示例展示一下AWT的使用,在下面的AWT示例中,展示了利用AWT的java.awt.Graphics对象绘制圆角矩形、矩形和椭圆。代码如下所示:
import java.applet.*; import java.awt.Color; import java.awt.Graphics; /** * AWT的演示实例, * 绘制圆角矩形、矩形和椭圆. */ public class AwtSample extends Applet { private static final long serialVersionUID = 1L; /** * 绘制图形. * @param g图形对象 */ public void paint(Graphics g) { g.drawRect(24, 22, 60, 34); g.drawRoundRect(10, 10, 90, 60, 50, 30); //设置图形颜色 g.setColor(Color.cyan); g.fillOval(10, 80, 120, 30); int k = 0; for (int i = 1; i <= 8; i++) { //实现了一个颜色的变迁 Color c = new Color(i * 32 - 1, 0, 0); g.setColor(c); k = k + 5; g.drawOval(80 + k, 77 + k, 120 - 2 * k, 80 - 2 * k); } } }
在Eclipse中运行该程序,运行效果如图2-1所示。
图2-1 利用AWT绘制圆角矩形、矩形和椭圆的实例
AWT的后续版本进行了很大改进,可以绘制漂亮的2D图形。下面是一个绘制2D图形的示例,需要用到java.awt.Graphics2D,并且用到java.awt.geom中有关二维几何中的2D椭圆类,代码如下:
import java.applet.Applet; import java.awt.AlphaComposite; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.geom.Ellipse2D; /** * AWT中2D图形的演示示例. */ public class Awt2DSample extends Applet { private static final long serialVersionUID = 1L; /** * 绘制2D图形. * @param g图形对象 */ public void paint(Graphics g) { //获得Graphics2D对象 Graphics2D g2 = (Graphics2D) g; //设置渲染的质量 g2.setRenderingHint(RenderingHints.KEY ANTIALIASING, RenderingHints.VALUE ANTIALIAS ON); //定义线的倾斜度 GradientPaint gp = new GradientPaint(0, 60, Color.red, 0, 120, Color.yellow); //新建一个椭圆实例 Ellipse2D r = new Ellipse2D.Float(30, 60, 160, 60); g2.setPaint(gp); g2.fill(r); //设置旋转 g2.transform(AffineTransform.getRotateInstance(Math.PI/8)); g2.setFont(new Font("宋体", Font.BOLD, 30)); g2.setPaint(Color.blue); //设置透明度 g2.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC OVER, 0.5f)); g2.drawString("2D图形演示", 50,70); } }
运行效果如图2-2所示。
图2-2 AWT中2D图形示例
2.4 常用图形与报表技术
在本小节中,笔者将对常用的图形和报表技术进行介绍。在图形技术中,将对JFreeChart、Cewolf和jCharts进行简要介绍,使得读者对这三种图形技术有一个大致的了解。而后,在介绍报表技术时,主要介绍了iReport、JasperReports、Eclipse BIRT、JFreeReport和OpenReports。这些技术在而后的各章都将进行较详尽的讲述,本章只需要读者对常用的这几种图形和报表技术有个了解。
2.4.1 图形技术
1. JFreeChart
JFreeChart是最常用的一种Web开源图形技术,它主要采用AWT包作为图形显示的后台支持,在新版本中,也采用Swing来完成一些更高级的图形功能。支持的图形种类广泛,例如柱状图、曲线图、时序图、饼图、甘特图、区域图、财政图表、仪表图和组合图等。并且可以在现有图形中非常容易地进行扩展,开发其他所需的图形,由于其易用性和功能的强大,在Java开发社区备受好评。
2. Cewolf
Cewolf是基于JFreeChart的一种开源Web图形技术。它所做的工作相对简单,主要功能是为Java Web开发人员提供一套JFreeChart图形的标签,使得开发人员能非常容易的调用其图形标签完成图形的创建工作。
又由于它是基于JFreeChart的,所以JFreeChart支持的所有图形它也提供支持。将JFreeChart和Cewolf结合开发图形,能大大的降低开发工作。
3. jCharts
jCharts为sourceforge上一个开源Web图形技术,它是100%的制图工具,它的实现原理与JFreeChart类似,基于AWT包,在AWT的基础上进行二次开发。不过相对JFreeChart,它支持的图形类型相对较少,它目前支持的图形有柱状图、饼图、曲线图、点状图、区域图、雷达图和组合图。它相对JFreeChart来说,显得轻巧,对于开发过程中常用图形的绘制已经足够。而且它设计合理,读者可以通过继承其某些类轻松的完成其他种类图形的扩展。
2.4.2 报表技术
1. iReport
iReport作为一个开源的、优秀的报表设计器,功能强大。它不但有适合于Windows安装的应用程序,同时,还提供完全开放的源代码,可供参考及原理分析。通过iReport可视化的图形界面,可以设计出各种各样的简单或复杂的报表,这些报表可以作JasperReport的报表模板,避免编写复杂XML,因此可以Web报表开发节省大量的开发时间。
使用iReport,可以使用各种数据源制作报表,并且,还可以可视化的设置报表的字段、参数和变量等信息。对于复杂的报表,例如包含子报表的报表,以及交叉报表等也都可以很容易地通过可视化的界面实现。
2. JasperReports
JasperReports是一个报表制作工具,用户须按照其规则编写一个XML,然后得到用户所要的报表文件。它可以以PDF、HTML或XML等多种形式产生报表,并支持CSV,XLS等格式展示报表。
在实际应用中,一般的情况是:首先利用iReport进行模板的设计,然后采用JasperReports进行数据填、编译及展示,将两者完美的结合起来,制作出多种形式的报表。
JasperReports能够丰富且灵活的对报表布局进行设计、支持对数据进行文字化或图形化的展示。同时,它支持多种数据源、多种报表格式的输出,并且对子报表等也提供了很好的支持。
iReport+JasperReports是在项目中制作报表的一种常用选择。
3. Eclipse Birt
Eclipse BIRT是一个基于Eclipse的开放源代码报表系统。使用BIRT,读者能制作出多样化的报表:列表、包括图形的报表、包括子报表的报表、交叉表等。
BIRT的可视化的程度很高,可以可视化的进行如下操作:
● 设计数据源和数据集;
● 进行报表版面的设计(例如添加文本信息、添加图像信息、设计网格、列表、图表以及页眉和页脚等信息);
● 库的设计;
● 模板的设计;
● BIRT还允许开发人员进行更高层次的编码,开发人员可选择使用Java或JavaScript脚本来进行自定义的编码。
4. JFreeReport
JFreeReport是开源网站SourceForge.net上的一个项目,与JFreeChart一样属于jfree公司的产品。它是用来创建报表的一个免费的Java类库。JFreeReport数据继承自Swing组件的T ableModel接口,并且根据一个基于XML的报表模板文件被格式化。产生的报表可以在屏幕上预览、发送到打印机或者保存为PDF、HTML、Excel、CSV和普通的文本格式。JFreeReport不仅支持基于C/S结构的系统,而且支持基于B/S结构的系统的在线报表显示。
JFeeReport可从XML中读取数据,还可以从数据库中获取数据,还可以创建图形的报表、包括子报表的报表等。使用JFreeReprot制作的报表还可以通过Web的方式进行访问。
5. OpenReports
OpenReports提供基于web的灵活的开源报表解决方案,通过浏览器自动生成动态PDF、XLS、RTF、HTML、CSV、和Chart报表。利用到的开源技术有Hibernate、Veloctiy、Struts2、Spring 2等。
OpenReports支持各种报表引擎,如JasperReports、FFreeReport、JXLS以及Eclipse BIRT,能满足日常项目中各种需求。OpenReports当然也支持QueryReports及ChartReports,因此,利用QueryReports无须预先定义报表模板,而可以直接通过创建SQL语句来构建报表。
在OpenReports中,可以对用户、分组、报表、数据源、报表参数、图表、系统和管理员等进行管理。
2.5 小结
本章侧重介绍了Java图形报表技术的发展历史,如在Java 2平台发行之前,AWT在Java的图形方面是主角,Swing作为其扩展。Java 2平台发行后,成为JFC核心的Swing技术大行其道,它使用AWT的一个子集来实现“相同的Java应用程序在每个平台上都有相同的外观”的目标。本章还介绍了Swing的Java Look and feel技术,以及Java 2D一些常用的API,介绍了Java中图形技术AWT和Swing的一些简要开发实例,通过简单的图形展示例子介绍了其API的使用。
最后向读者介绍常用的图形(JFreeChart、Cewolf和jCharts)和报表(iReport、JasperReports、Eclipse BIRT、JFreeReport和OpenReports)技术,这些技术将在后续章节详细描述,本章的介绍起的只是一个提纲挈领的作用,读者可以根据介绍为项目选择合适的图形或报表技术。