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

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

【本章導(dǎo)讀】

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

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

自從早期Java語言出現(xiàn)到現(xiàn)在,圖形和用戶界面功能已取得了飛躍式的發(fā)展。Java2平臺(tái)包含一個(gè)復(fù)雜的跨平臺(tái)的用戶界面體系結(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ǔ)類(Java Foundation Classes,JFC)的一部分。JFC指的是包含在Java2平臺(tái)內(nèi)的一整套圖形和用戶界面技術(shù),包括AWT和Swing等,其核心是Swing。AWT的最大缺點(diǎn)是在相同的Java應(yīng)用程序在每個(gè)平臺(tái)上都有不同的外觀。

現(xiàn)在來看一下Swing,它使用AWT的一個(gè)子集來實(shí)現(xiàn)這個(gè)目標(biāo),這個(gè)子集包括基本畫圖操作和java.awt包中的某些類(包括Container、Window、Panel、Dialog和Frame)。Swing沒有完全遵循“Java語言作為一個(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)之前,語言中的圖形功能相當(dāng)簡(jiǎn)單,僅限于單像素厚度的實(shí)線。少數(shù)幾個(gè)幾何圖形(如橢圓、弧和多邊形)和基本的畫圖功能。隨著Java 2D API的出現(xiàn),所有的一切都改變了。Java 2D API的核心是由java.awt.Graphics2D類提供的,該類是java.awt.Graphics的一個(gè)子類。API的其他部分由java.awt層次結(jié)構(gòu)中的其他包提供,包括java.awt.color、java.awt.font和java.awt.geom。

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

首先,通過簡(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橢圓類,代碼如下:

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

2. Cewolf

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

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

3. jCharts

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

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

1. iReport

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

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

2. JasperReports

JasperReports是一個(gè)報(bào)表制作工具,用戶須按照其規(guī)則編寫一個(gè)XML,然后得到用戶所要的報(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é)合起來,制作出多種形式的報(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的開放源代碼報(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)格、列表、圖表以及頁眉和頁腳等信息);

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

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

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

4. JFreeReport

JFreeReport是開源網(wǎng)站SourceForge.net上的一個(gè)項(xiàng)目,與JFreeChart一樣屬于jfree公司的產(chǎn)品。它是用來創(chuàng)建報(bào)表的一個(gè)免費(fèi)的Java類庫。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ù)庫中獲取數(shù)據(jù),還可以創(chuàng)建圖形的報(bào)表、包括子報(bào)表的報(bào)表等。使用JFreeReprot制作的報(bào)表還可以通過Web的方式進(jìn)行訪問。

5. OpenReports

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

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

在OpenReports中,可以對(duì)用戶、分組、報(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è)子集來實(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)要開發(fā)實(shí)例,通過簡(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ù)。

主站蜘蛛池模板: 酒泉市| 太白县| 义乌市| 三穗县| 德保县| 高淳县| 克拉玛依市| 禄劝| 贵定县| 海安县| 全州县| 红原县| 太仆寺旗| 玉溪市| 武邑县| 万盛区| 彰化市| 惠安县| 晴隆县| 手游| 嘉峪关市| 绍兴市| 井研县| 波密县| 普兰店市| 噶尔县| 池州市| 景德镇市| 高唐县| 贵州省| 应用必备| 松江区| 临江市| 石家庄市| 五寨县| 枣强县| 手游| 岫岩| 桂东县| 高安市| 东丰县|