官术网_书友最值得收藏!

第2章 圖形報(bào)表開(kāi)發(fā)基礎(chǔ)

【本章導(dǎo)讀】

本章講述Java圖形和報(bào)表技術(shù)的發(fā)展歷史,并介紹了Java中利用AWT和Swing進(jìn)行圖形的編程實(shí)例,接下來(lái)簡(jiǎn)要介紹了當(dāng)前常用的圖形與報(bào)表技術(shù),從而使讀者對(duì)Java的圖形報(bào)表技術(shù)有一個(gè)大致的了解。

2.1 圖形與報(bào)表開(kāi)發(fā)概述

自從早期Java語(yǔ)言出現(xiàn)到現(xiàn)在,圖形和用戶(hù)界面功能已取得了飛躍式的發(fā)展。Java2平臺(tái)包含一個(gè)復(fù)雜的跨平臺(tái)的用戶(hù)界面體系結(jié)構(gòu),它包括眾多的高級(jí)組件、一個(gè)先進(jìn)、功能豐富且獨(dú)立于設(shè)備的圖形系統(tǒng)和許多多媒體擴(kuò)展。

2.2 發(fā)展歷史

在Java 2平臺(tái)發(fā)行之前,AWT(Abstract Window Toolkit,抽象窗口工具包)是Java平臺(tái)圖形功能的范圍。例如Swing等各種技術(shù)都是作為可選的擴(kuò)展引入的。

在Java 2平臺(tái)上,大部分?jǐn)U展都可以在平臺(tái)的核心找到一席之地,成為Java基礎(chǔ)類(lèi)(Java Foundation Classes,JFC)的一部分。JFC指的是包含在Java2平臺(tái)內(nèi)的一整套圖形和用戶(hù)界面技術(shù),包括AWT和Swing等,其核心是Swing。AWT的最大缺點(diǎn)是在相同的Java應(yīng)用程序在每個(gè)平臺(tái)上都有不同的外觀。

現(xiàn)在來(lái)看一下Swing,它使用AWT的一個(gè)子集來(lái)實(shí)現(xiàn)這個(gè)目標(biāo),這個(gè)子集包括基本畫(huà)圖操作和java.awt包中的某些類(lèi)(包括Container、Window、Panel、Dialog和Frame)。Swing沒(méi)有完全遵循“Java語(yǔ)言作為一個(gè)平臺(tái)”的路線,而且它支持可插式Look-and-Feel(它很接近主題的概念,在linux社區(qū)中非常流行)。每一個(gè)Swing組件都有一個(gè)自己的功能模型和一個(gè)獨(dú)立的外觀(look-and-feel),這可以預(yù)先設(shè)置或在運(yùn)行時(shí)更改。這樣就成功地解決了AWT的最大缺點(diǎn)。

在Java 2平臺(tái)之前,語(yǔ)言中的圖形功能相當(dāng)簡(jiǎn)單,僅限于單像素厚度的實(shí)線。少數(shù)幾個(gè)幾何圖形(如橢圓、弧和多邊形)和基本的畫(huà)圖功能。隨著Java 2D API的出現(xiàn),所有的一切都改變了。Java 2D API的核心是由java.awt.Graphics2D類(lèi)提供的,該類(lèi)是java.awt.Graphics的一個(gè)子類(lèi)。API的其他部分由java.awt層次結(jié)構(gòu)中的其他包提供,包括java.awt.color、java.awt.font和java.awt.geom。

2.3 AWT、Swing開(kāi)發(fā)實(shí)例

首先,通過(guò)簡(jiǎn)單的示例展示一下AWT的使用,在下面的AWT示例中,展示了利用AWT的java.awt.Graphics對(duì)象繪制圓角矩形、矩形和橢圓。代碼如下所示:

import java.applet.*;
import java.awt.Color;
import java.awt.Graphics;

/**
 * AWT的演示實(shí)例,
 * 繪制圓角矩形、矩形和橢圓.
 */
public class AwtSample extends Applet {
    private static final long serialVersionUID = 1L;

    /**
      * 繪制圖形.
      * @param g圖形對(duì)象
      */
    public void paint(Graphics g) {
          g.drawRect(24, 22, 60, 34);
          g.drawRoundRect(10, 10, 90, 60, 50, 30);

          //設(shè)置圖形顏色
          g.setColor(Color.cyan);
          g.fillOval(10, 80, 120, 30);

          int k = 0;
          for (int i = 1; i <= 8; i++) {
              //實(shí)現(xiàn)了一個(gè)顏色的變遷
              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中運(yùn)行該程序,運(yùn)行效果如圖2-1所示。

圖2-1 利用AWT繪制圓角矩形、矩形和橢圓的實(shí)例

AWT的后續(xù)版本進(jìn)行了很大改進(jìn),可以繪制漂亮的2D圖形。下面是一個(gè)繪制2D圖形的示例,需要用到j(luò)ava.awt.Graphics2D,并且用到j(luò)ava.awt.geom中有關(guān)二維幾何中的2D橢圓類(lèi),代碼如下:

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圖形對(duì)象
      */
    public void paint(Graphics g) {
        //獲得Graphics2D對(duì)象
        Graphics2D g2 = (Graphics2D) g;
        //設(shè)置渲染的質(zhì)量
        g2.setRenderingHint(RenderingHints.KEY ANTIALIASING,
            RenderingHints.VALUE ANTIALIAS ON);
        //定義線的傾斜度
        GradientPaint gp = new GradientPaint(0, 60, Color.red,
                                        0, 120, Color.yellow);
        //新建一個(gè)橢圓實(shí)例
        Ellipse2D r = new Ellipse2D.Float(30, 60, 160, 60);
        g2.setPaint(gp);
        g2.fill(r);
        //設(shè)置旋轉(zhuǎn)
        g2.transform(AffineTransform.getRotateInstance(Math.PI/8));
        g2.setFont(new Font("宋體", Font.BOLD, 30));
        g2.setPaint(Color.blue);
        //設(shè)置透明度
        g2.setComposite(AlphaComposite.getInstance(
                                    AlphaComposite.SRC OVER, 0.5f));
        g2.drawString("2D圖形演示", 50,70);
    }
  }

運(yùn)行效果如圖2-2所示。

圖2-2 AWT中2D圖形示例

2.4 常用圖形與報(bào)表技術(shù)

在本小節(jié)中,筆者將對(duì)常用的圖形和報(bào)表技術(shù)進(jìn)行介紹。在圖形技術(shù)中,將對(duì)JFreeChart、Cewolf和jCharts進(jìn)行簡(jiǎn)要介紹,使得讀者對(duì)這三種圖形技術(shù)有一個(gè)大致的了解。而后,在介紹報(bào)表技術(shù)時(shí),主要介紹了iReport、JasperReports、Eclipse BIRT、JFreeReport和OpenReports。這些技術(shù)在而后的各章都將進(jìn)行較詳盡的講述,本章只需要讀者對(duì)常用的這幾種圖形和報(bào)表技術(shù)有個(gè)了解。

2.4.1 圖形技術(shù)

1. JFreeChart

JFreeChart是最常用的一種Web開(kāi)源圖形技術(shù),它主要采用AWT包作為圖形顯示的后臺(tái)支持,在新版本中,也采用Swing來(lái)完成一些更高級(jí)的圖形功能。支持的圖形種類(lèi)廣泛,例如柱狀圖、曲線圖、時(shí)序圖、餅圖、甘特圖、區(qū)域圖、財(cái)政圖表、儀表圖和組合圖等。并且可以在現(xiàn)有圖形中非常容易地進(jìn)行擴(kuò)展,開(kāi)發(fā)其他所需的圖形,由于其易用性和功能的強(qiáng)大,在Java開(kāi)發(fā)社區(qū)備受好評(píng)。

2. Cewolf

Cewolf是基于JFreeChart的一種開(kāi)源Web圖形技術(shù)。它所做的工作相對(duì)簡(jiǎn)單,主要功能是為Java Web開(kāi)發(fā)人員提供一套JFreeChart圖形的標(biāo)簽,使得開(kāi)發(fā)人員能非常容易的調(diào)用其圖形標(biāo)簽完成圖形的創(chuàng)建工作。

又由于它是基于JFreeChart的,所以JFreeChart支持的所有圖形它也提供支持。將JFreeChart和Cewolf結(jié)合開(kāi)發(fā)圖形,能大大的降低開(kāi)發(fā)工作。

3. jCharts

jCharts為sourceforge上一個(gè)開(kāi)源Web圖形技術(shù),它是100%的制圖工具,它的實(shí)現(xiàn)原理與JFreeChart類(lèi)似,基于AWT包,在AWT的基礎(chǔ)上進(jìn)行二次開(kāi)發(fā)。不過(guò)相對(duì)JFreeChart,它支持的圖形類(lèi)型相對(duì)較少,它目前支持的圖形有柱狀圖、餅圖、曲線圖、點(diǎn)狀圖、區(qū)域圖、雷達(dá)圖和組合圖。它相對(duì)JFreeChart來(lái)說(shuō),顯得輕巧,對(duì)于開(kāi)發(fā)過(guò)程中常用圖形的繪制已經(jīng)足夠。而且它設(shè)計(jì)合理,讀者可以通過(guò)繼承其某些類(lèi)輕松的完成其他種類(lèi)圖形的擴(kuò)展。

2.4.2 報(bào)表技術(shù)

1. iReport

iReport作為一個(gè)開(kāi)源的、優(yōu)秀的報(bào)表設(shè)計(jì)器,功能強(qiáng)大。它不但有適合于Windows安裝的應(yīng)用程序,同時(shí),還提供完全開(kāi)放的源代碼,可供參考及原理分析。通過(guò)iReport可視化的圖形界面,可以設(shè)計(jì)出各種各樣的簡(jiǎn)單或復(fù)雜的報(bào)表,這些報(bào)表可以作JasperReport的報(bào)表模板,避免編寫(xiě)復(fù)雜XML,因此可以Web報(bào)表開(kāi)發(fā)節(jié)省大量的開(kāi)發(fā)時(shí)間。

使用iReport,可以使用各種數(shù)據(jù)源制作報(bào)表,并且,還可以可視化的設(shè)置報(bào)表的字段、參數(shù)和變量等信息。對(duì)于復(fù)雜的報(bào)表,例如包含子報(bào)表的報(bào)表,以及交叉報(bào)表等也都可以很容易地通過(guò)可視化的界面實(shí)現(xiàn)。

2. JasperReports

JasperReports是一個(gè)報(bào)表制作工具,用戶(hù)須按照其規(guī)則編寫(xiě)一個(gè)XML,然后得到用戶(hù)所要的報(bào)表文件。它可以以PDF、HTML或XML等多種形式產(chǎn)生報(bào)表,并支持CSV,XLS等格式展示報(bào)表。

在實(shí)際應(yīng)用中,一般的情況是:首先利用iReport進(jìn)行模板的設(shè)計(jì),然后采用JasperReports進(jìn)行數(shù)據(jù)填、編譯及展示,將兩者完美的結(jié)合起來(lái),制作出多種形式的報(bào)表。

JasperReports能夠豐富且靈活的對(duì)報(bào)表布局進(jìn)行設(shè)計(jì)、支持對(duì)數(shù)據(jù)進(jìn)行文字化或圖形化的展示。同時(shí),它支持多種數(shù)據(jù)源、多種報(bào)表格式的輸出,并且對(duì)子報(bào)表等也提供了很好的支持。

iReport+JasperReports是在項(xiàng)目中制作報(bào)表的一種常用選擇。

3. Eclipse Birt

Eclipse BIRT是一個(gè)基于Eclipse的開(kāi)放源代碼報(bào)表系統(tǒng)。使用BIRT,讀者能制作出多樣化的報(bào)表:列表、包括圖形的報(bào)表、包括子報(bào)表的報(bào)表、交叉表等。

BIRT的可視化的程度很高,可以可視化的進(jìn)行如下操作:

● 設(shè)計(jì)數(shù)據(jù)源和數(shù)據(jù)集;

● 進(jìn)行報(bào)表版面的設(shè)計(jì)(例如添加文本信息、添加圖像信息、設(shè)計(jì)網(wǎng)格、列表、圖表以及頁(yè)眉和頁(yè)腳等信息);

● 庫(kù)的設(shè)計(jì);

● 模板的設(shè)計(jì);

● BIRT還允許開(kāi)發(fā)人員進(jìn)行更高層次的編碼,開(kāi)發(fā)人員可選擇使用Java或JavaScript腳本來(lái)進(jìn)行自定義的編碼。

4. JFreeReport

JFreeReport是開(kāi)源網(wǎng)站SourceForge.net上的一個(gè)項(xiàng)目,與JFreeChart一樣屬于jfree公司的產(chǎn)品。它是用來(lái)創(chuàng)建報(bào)表的一個(gè)免費(fèi)的Java類(lèi)庫(kù)。JFreeReport數(shù)據(jù)繼承自Swing組件的T ableModel接口,并且根據(jù)一個(gè)基于XML的報(bào)表模板文件被格式化。產(chǎn)生的報(bào)表可以在屏幕上預(yù)覽、發(fā)送到打印機(jī)或者保存為PDF、HTML、Excel、CSV和普通的文本格式。JFreeReport不僅支持基于C/S結(jié)構(gòu)的系統(tǒng),而且支持基于B/S結(jié)構(gòu)的系統(tǒng)的在線報(bào)表顯示。

JFeeReport可從XML中讀取數(shù)據(jù),還可以從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù),還可以創(chuàng)建圖形的報(bào)表、包括子報(bào)表的報(bào)表等。使用JFreeReprot制作的報(bào)表還可以通過(guò)Web的方式進(jìn)行訪問(wèn)。

5. OpenReports

OpenReports提供基于web的靈活的開(kāi)源報(bào)表解決方案,通過(guò)瀏覽器自動(dòng)生成動(dòng)態(tài)PDF、XLS、RTF、HTML、CSV、和Chart報(bào)表。利用到的開(kāi)源技術(shù)有Hibernate、Veloctiy、Struts2、Spring 2等。

OpenReports支持各種報(bào)表引擎,如JasperReports、FFreeReport、JXLS以及Eclipse BIRT,能滿足日常項(xiàng)目中各種需求。OpenReports當(dāng)然也支持QueryReports及ChartReports,因此,利用QueryReports無(wú)須預(yù)先定義報(bào)表模板,而可以直接通過(guò)創(chuàng)建SQL語(yǔ)句來(lái)構(gòu)建報(bào)表。

在OpenReports中,可以對(duì)用戶(hù)、分組、報(bào)表、數(shù)據(jù)源、報(bào)表參數(shù)、圖表、系統(tǒng)和管理員等進(jìn)行管理。

2.5 小結(jié)

本章側(cè)重介紹了Java圖形報(bào)表技術(shù)的發(fā)展歷史,如在Java 2平臺(tái)發(fā)行之前,AWT在Java的圖形方面是主角,Swing作為其擴(kuò)展。Java 2平臺(tái)發(fā)行后,成為JFC核心的Swing技術(shù)大行其道,它使用AWT的一個(gè)子集來(lái)實(shí)現(xiàn)“相同的Java應(yīng)用程序在每個(gè)平臺(tái)上都有相同的外觀”的目標(biāo)。本章還介紹了Swing的Java Look and feel技術(shù),以及Java 2D一些常用的API,介紹了Java中圖形技術(shù)AWT和Swing的一些簡(jiǎn)要開(kāi)發(fā)實(shí)例,通過(guò)簡(jiǎn)單的圖形展示例子介紹了其API的使用。

最后向讀者介紹常用的圖形(JFreeChart、Cewolf和jCharts)和報(bào)表(iReport、JasperReports、Eclipse BIRT、JFreeReport和OpenReports)技術(shù),這些技術(shù)將在后續(xù)章節(jié)詳細(xì)描述,本章的介紹起的只是一個(gè)提綱挈領(lǐng)的作用,讀者可以根據(jù)介紹為項(xiàng)目選擇合適的圖形或報(bào)表技術(shù)。

主站蜘蛛池模板: 新乡市| 县级市| 黔西县| 青河县| 顺昌县| 济宁市| 若尔盖县| 东辽县| 克山县| 时尚| 玉林市| 石嘴山市| 通江县| 兴宁市| 邻水| 田阳县| 蓬溪县| 曲麻莱县| 孟津县| 桐梓县| 蓝山县| 喀喇沁旗| 湛江市| 久治县| 承德市| 博湖县| 牟定县| 金塔县| 湟源县| 韩城市| 湘潭市| 黎川县| 文化| 云阳县| 多伦县| 东兰县| 姜堰市| 康定县| 临颍县| 庐江县| 三门县|