作者:ronghao100
在使用cewolf 之前,首先來熟悉一下jFreeChart 。這里分三部分來介紹 jFreeChart 。第一部分介紹jFreeChart產(chǎn)生
圖形的流程及相關(guān)的重要的類;第二部分介紹四種常用的報表圖(餅圖、柱狀圖、折線圖、時間序列圖);第三部分
介紹在圖形中增加Item Lable 。 
jFreeChart 的版本是jfreechart-1.0.0-pre2(1)
cewolf 的最新版本是cewolf-0.12.0

一、jFreeChart產(chǎn)生圖形的流程
  1. 創(chuàng)建一個數(shù)據(jù)源(dataset)來包含將要在圖形中顯示的數(shù)據(jù)?
  2. 創(chuàng)建一個 JFreeChart 對象來代表要顯示的圖形
  3. 把圖形輸出
   重要的類和接口:
   org.jfree.data.general.Dataset  所有數(shù)據(jù)源類都要實現(xiàn)的接口
   org.jfree.chart.ChartFactory    由它來產(chǎn)生 JFreeChart 對象
   org.jfree.chart.JFreeChart    所有對圖形的調(diào)整都是通過它噢!!
   org.jfree.chart.plot.Plot    通過JFreeChart 對象獲得它,然后再通過它對圖形外部部分(例:坐標軸)調(diào)整
                                注意:它有很多子類,一般都下嗍造型到它的子類!
   org.jfree.chart.renderer.AbstractRenderer     通過JFreeChart 對象獲得它,然后再通過它對圖形內(nèi)部部分
                                                (例:折線的類型)調(diào)整。同樣,針對不同類型的報表圖,它有
                                                著不同的子類實現(xiàn)!在下面我們簡稱它為 Renderer
   下面我們結(jié)合不同類型的圖形來具體分析這個流程。
   
二、餅圖
   餅圖的dataset 一般是用PieDataset 接口,具體實現(xiàn)類是 DefaultPieDataset
   1、創(chuàng)建一個數(shù)據(jù)源(dataset):
    
private static PieDataset createDataset()
    
{
        DefaultPieDataset defaultpiedataset 
= new DefaultPieDataset(); //注意是DefaultPieDataset!!
        defaultpiedataset.setValue("One"new Double(43.200000000000003D));
        defaultpiedataset.setValue(
"Two"new Double(10D));
        defaultpiedataset.setValue(
"Three"new Double(27.5D));
        defaultpiedataset.setValue(
"Four"new Double(17.5D));
        
return defaultpiedataset;
    }
 
   
  2、由ChartFactory  產(chǎn)生 JFreeChart 對象

 private static JFreeChart createChart(PieDataset piedataset)
    
{
        JFreeChart jfreechart 
= ChartFactory.createPieChart("Pie Chart Demo 1",  //圖形標題名稱
                                                              piedataset,   // dataset
                                                              true,      // legend?
                                                              true,     // tooltips?
                                                              false);  //URLs?
        PiePlot pieplot = (PiePlot)jfreechart.getPlot();  //通過JFreeChart 對象獲得 plot:PiePlot!!
        pieplot.setNoDataMessage("No data available");    // 沒有數(shù)據(jù)的時候顯示的內(nèi)容
        return jfreechart;
    }
 
   
    一些重要的方法:
    pieplot.setExplodePercent(0,0.3D) //把Lable 為"One" 的那一塊”挖“出來30%    
   3、輸出略  
   
三、柱狀圖
   柱狀圖的dataset 一般是用CatagoryDataset接口(具體實現(xiàn)類是DefaultCategoryDataset),也會用 IntervalXYDataset 
   接口
   1、創(chuàng)建一個數(shù)據(jù)源(dataset):
 private static CategoryDataset createDataset()
    
{
        String series1 
= "First";
        String series2 
= "Second";
        String series3 
= "Third";
        String category1 
= "Category 1";
        String category2 
= "Category 2";
        String category3 
= "Category 3";
        String category4 
= "Category 4";
        String category5 
= "Category 5";
        DefaultCategoryDataset defaultcategorydataset 
= new DefaultCategoryDataset();
        defaultcategorydataset.addValue(
1.0D, series1, category1);
        defaultcategorydataset.addValue(4D, series1, category2);
        defaultcategorydataset.addValue(3D, series1, category3);
        defaultcategorydataset.addValue(5D, series1, category4);
        defaultcategorydataset.addValue(5D, series1, category5);
        
        defaultcategorydataset.addValue(5D, series2, category1);
        defaultcategorydataset.addValue(7D, series2, category2);
        defaultcategorydataset.addValue(6D, series2, category3);
        defaultcategorydataset.addValue(8D, series2, category4);
        defaultcategorydataset.addValue(4D, series2, category5);
        
        defaultcategorydataset.addValue(4D, series3, category1);
        defaultcategorydataset.addValue(3D, series3, category2);
        defaultcategorydataset.addValue(2D, series3, category3);
        defaultcategorydataset.addValue(3D, series3, category4);
        defaultcategorydataset.addValue(6D, series3, category5);
        
return defaultcategorydataset;
    }


      2、由ChartFactory  產(chǎn)生 JFreeChart 對象    
  
  private static JFreeChart createChart(CategoryDataset categorydataset)
    
{
        JFreeChart jfreechart 
= ChartFactory.createBarChart("Bar Chart Demo"//圖形標題名稱
                                                            "Category",//domain 軸 Lable 
                                                                         這里先簡單理解為橫坐標Lable好了
                                                            
"Value"//range 軸 Lable
                                                                       這里也先簡單理解為縱坐標Lable好了
                                                            categorydataset, 
//  dataset
                                                            PlotOrientation.VERTICAL, //垂直顯示
                                                            true// legend?
                                                            true,  // tooltips?
                                                            false); //URLs?
        jfreechart.setBackgroundPaint(Color.white);   //設(shè)定背景色為白色
        CategoryPlot categoryplot = jfreechart.getCategoryPlot(); //獲得 plot:CategoryPlot!!
        categoryplot.setBackgroundPaint(Color.lightGray); //設(shè)定圖表數(shù)據(jù)顯示部分背景色
        categoryplot.setDomainGridlinePaint(Color.white); //橫坐標網(wǎng)格線白色
        categoryplot.setDomainGridlinesVisible(true); //可見
        categoryplot.setRangeGridlinePaint(Color.white); //縱坐標網(wǎng)格線白色
        
//下面兩行使縱坐標的最小單位格為整數(shù)
        NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();
        numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        BarRenderer barrenderer 
= (BarRenderer)categoryplot.getRenderer(); //獲得renderer 注意這里是下嗍造型
                                                                             到BarRenderer!!
        barrenderer.setDrawBarOutline(
false); // Bar的外輪廓線不畫
        GradientPaint gradientpaint = new GradientPaint(0.0F0.0F, Color.blue, 
        
0.0F0.0Fnew Color(0064));   //設(shè)定特定顏色
        GradientPaint gradientpaint1 = new GradientPaint(0.0F0.0F, Color.green, 
        
0.0F0.0Fnew Color(0640));
        GradientPaint gradientpaint2 
= new GradientPaint(0.0F0.0F, Color.red,
        
0.0F0.0Fnew Color(6400));
        barrenderer.setSeriesPaint(
0, gradientpaint); //給series1 Bar設(shè)定上面定義的顏色
        barrenderer.setSeriesPaint(1, gradientpaint1); //給series2 Bar 設(shè)定上面定義的顏色
        barrenderer.setSeriesPaint(2, gradientpaint2); //給series3 Bar 設(shè)定上面定義的顏色
        CategoryAxis categoryaxis = categoryplot.getDomainAxis();  //橫軸上的 Lable 45度傾斜
        categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);        
        
return jfreechart;
    }
  
    一些重要的方法:(增加一塊標記)
        IntervalMarker intervalmarker = new IntervalMarker(4.5D, 7.5D);
        intervalmarker.setLabel("Target Range");
        intervalmarker.setLabelFont(new Font("SansSerif", 2, 11));
        intervalmarker.setLabelAnchor(RectangleAnchor.LEFT);
        intervalmarker.setLabelTextAnchor(TextAnchor.CENTER_LEFT);
        intervalmarker.setPaint(new Color(222, 222, 255, 128));
        categoryplot.addRangeMarker(intervalmarker, Layer.BACKGROUND);    
        
四、折線圖
   折線圖的dataset 兩種CatagoryDataset接口(具體實現(xiàn)類是DefaultCategoryDataset),XYDataset 接口 
   1、CatagoryDataset接口:         
   A、創(chuàng)建一個數(shù)據(jù)源(dataset): 
    
private static CategoryDataset createDataset()
    
{
        String series1 
= "First";
        String series2 
= "Second";
        String series3 
= "Third";
        String type1 
= "Type 1";
        String type2 
= "Type 2";
        String type3 
= "Type 3";
        String type4 
= "Type 4";
        String type5 
= "Type 5";
        String type6 
= "Type 6";
        String type7 
= "Type 7";
        String type8 
= "Type 8";
        DefaultCategoryDataset defaultcategorydataset 
= new DefaultCategoryDataset();
        defaultcategorydataset.addValue(
1.0D, series1, type1);
        defaultcategorydataset.addValue(4D, series1, type2);
        defaultcategorydataset.addValue(3D, series1, type3);
        defaultcategorydataset.addValue(5D, series1, type4);
        defaultcategorydataset.addValue(5D, series1, type5);
        defaultcategorydataset.addValue(7D, series1, type6);
        defaultcategorydataset.addValue(7D, series1, type7);
        defaultcategorydataset.addValue(8D, series1, type8);
        
        defaultcategorydataset.addValue(5D, series2, type1);
        defaultcategorydataset.addValue(7D, series2, type2);
        defaultcategorydataset.addValue(6D, series2, type3);
        defaultcategorydataset.addValue(8D, series2, type4);
        defaultcategorydataset.addValue(4D, series2, type5);
        defaultcategorydataset.addValue(4D, series2, type6);
        defaultcategorydataset.addValue(2D, series2, type7);
        defaultcategorydataset.addValue(
1.0D, series2, type8);
        
        defaultcategorydataset.addValue(4D, series3, type1);
        defaultcategorydataset.addValue(3D, series3, type2);
        defaultcategorydataset.addValue(2D, series3, type3);
        defaultcategorydataset.addValue(3D, series3, type4);
        defaultcategorydataset.addValue(6D, series3, type5);
        defaultcategorydataset.addValue(3D, series3, type6);
        defaultcategorydataset.addValue(4D, series3, type7);
        defaultcategorydataset.addValue(3D, series3, type8);
        
return defaultcategorydataset;
    }
 
   B、由ChartFactory  產(chǎn)生 JFreeChart 對象     (與上面重復的部分就不再注釋)
    
private static JFreeChart createChart(CategoryDataset categorydataset)
    
{
        JFreeChart jfreechart 
= ChartFactory.createLineChart("Line Chart Demo 1"
                                                             
"Type"
                                                             
"Value"
                                                             categorydataset, 
                                                             PlotOrientation.VERTICAL, 
                                                             
true
                                                             
true
                                                             
false);
        jfreechart.setBackgroundPaint(Color.white);
        CategoryPlot categoryplot 
= (CategoryPlot)jfreechart.getPlot();
        categoryplot.setBackgroundPaint(Color.lightGray);
        categoryplot.setRangeGridlinePaint(Color.white);
        NumberAxis numberaxis 
= (NumberAxis)categoryplot.getRangeAxis();
        numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        numberaxis.setAutoRangeIncludesZero(
true);
        
//獲得renderer 注意這里是下嗍造型到lineandshaperenderer!!
        LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)categoryplot.getRenderer();
        lineandshaperenderer.setShapesVisible(
true); //series 點(即數(shù)據(jù)點)可見
        lineandshaperenderer.setSeriesStroke(0new BasicStroke(2.0F111.0Fnew float[] {
            10F, 6F
        }
0.0F)); //定義series為"First"的(即series1)點之間的連線 ,這里是虛線,默認是直線
        lineandshaperenderer.setSeriesStroke(1new BasicStroke(2.0F111.0Fnew float[] {
            6F, 6F
        }
0.0F)); //定義series為"Second"的(即series2)點之間的連線
        lineandshaperenderer.setSeriesStroke(2new BasicStroke(2.0F111.0Fnew float[] {
            
2.0F, 6F
        }
0.0F)); //定義series為"Third"的(即series3)點之間的連線
        return jfreechart;
    }
 
        
一些重要的方法:
       
 lineandshaperenderer.setLineVisible(true)  //series 點(即數(shù)據(jù)點)間有連線可見
   2、XYDataset 接口:
   A、創(chuàng)建一個數(shù)據(jù)源(dataset):
    
private static XYDataset createDataset()
    
{
        XYSeries xyseries 
= new XYSeries("First"); //先產(chǎn)生XYSeries 對象
        xyseries.add(1.0D1.0D);
        xyseries.add(2D, 4D);
        xyseries.add(3D, 3D);
        xyseries.add(4D, 5D);
        xyseries.add(5D, 5D);
        xyseries.add(6D, 7D);
        xyseries.add(7D, 7D);
        xyseries.add(8D, 8D);
        
        XYSeries xyseries1 
= new XYSeries("Second");
        xyseries1.add(
1.0D, 5D);
        xyseries1.add(2D, 7D);
        xyseries1.add(3D, 6D);
        xyseries1.add(4D, 8D);
        xyseries1.add(5D, 4D);
        xyseries1.add(6D, 4D);
        xyseries1.add(7D, 2D);
        xyseries1.add(8D, 
1.0D);
        
        XYSeries xyseries2 
= new XYSeries("Third");
        xyseries2.add(3D, 4D);
        xyseries2.add(4D, 3D);
        xyseries2.add(5D, 2D);
        xyseries2.add(6D, 3D);
        xyseries2.add(7D, 6D);
        xyseries2.add(8D, 3D);
        xyseries2.add(9D, 4D);
        xyseries2.add(10D, 3D);
        
        XYSeriesCollection xyseriescollection 
= new XYSeriesCollection(); //再用XYSeriesCollection添加入XYSeries 對象
        xyseriescollection.addSeries(xyseries);
        xyseriescollection.addSeries(xyseries1);
        xyseriescollection.addSeries(xyseries2);
        
return xyseriescollection;
    }

   B、由ChartFactory  產(chǎn)生 JFreeChart 對象 
   
 private static JFreeChart createChart(XYDataset xydataset)
    
{
        JFreeChart jfreechart 
= ChartFactory.createXYLineChart("Line Chart Demo 2"
                                                               
"X"
                                                               
"Y"
                                                               xydataset, 
                                                               PlotOrientation.VERTICAL, 
                                                               
true
                                                               
true
                                                               
false);
        jfreechart.setBackgroundPaint(Color.white);
        XYPlot xyplot 
= (XYPlot)jfreechart.getPlot(); //獲得 plot:XYPlot!!
        xyplot.setBackgroundPaint(Color.lightGray); //設(shè)定圖表數(shù)據(jù)顯示部分背景色
        xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); //設(shè)定坐標軸與圖表數(shù)據(jù)顯示部分距離
        xyplot.setDomainGridlinePaint(Color.white); //網(wǎng)格線顏色
        xyplot.setRangeGridlinePaint(Color.white);
        
//獲得 renderer 注意這里是XYLineAndShapeRenderer !!
        XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
        xylineandshaperenderer.setShapesVisible(
true); //數(shù)據(jù)點可見
        xylineandshaperenderer.setShapesFilled(true); //數(shù)據(jù)點被填充即不是空心點
        NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis();
        numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        
return jfreechart;
    }
                      
   一些重要的方法:
        XYLineAndShapeRenderer xylineandshaperenderer = new XYLineAndShapeRenderer();
        xylineandshaperenderer.setSeriesLinesVisible(0, false); //第一個XYSeries數(shù)據(jù)點間連線不可見
        xylineandshaperenderer.setSeriesShapesVisible(1, false); //第二個XYSeries數(shù)據(jù)點不可見
        xyplot.setRenderer(xylineandshaperenderer);   
        
五、時間序列圖
    時間序列圖和折線圖很相似,不同的是它在 domain軸的數(shù)據(jù)是時間而不是數(shù)字。 時間序列圖的dataset 是
    XYDataset 接口,具體實現(xiàn)類是TimeSeriesCollection ,和上面類似,有TimeSeries 對象,它被添加入
    TimeSeriesCollection 。                                                                               
  1、創(chuàng)建一個數(shù)據(jù)源(dataset):
    
private static XYDataset createDataset()
    
{
        TimeSeries timeseries 
= new TimeSeries("L&G European Index Trust",Month.class);
        timeseries.add(
new Month(22001), 181.8D);//這里用的是Month.class,同樣還有Day.class Year.class 等等
        timeseries.add(new Month(32001), 167.3D);
        timeseries.add(
new Month(42001), 153.8D);
        timeseries.add(
new Month(52001), 167.6D);
        timeseries.add(
new Month(62001), 158.8D);
        timeseries.add(
new Month(72001), 148.3D);
        timeseries.add(
new Month(82001), 153.9D);
        timeseries.add(
new Month(92001), 142.7D);
        timeseries.add(
new Month(102001), 123.2D);
        timeseries.add(
new Month(112001), 131.8D);
        timeseries.add(
new Month(122001), 139.6D);
        timeseries.add(
new Month(12002), 142.9D);
        timeseries.add(
new Month(22002), 138.7D);
        timeseries.add(
new Month(32002), 137.3D);
        timeseries.add(
new Month(42002), 143.9D);
        timeseries.add(
new Month(52002), 139.8D);
        timeseries.add(
new Month(62002), 137D);
        timeseries.add(
new Month(72002), 132.8D);
        
        TimeSeries timeseries1 
= new TimeSeries("L&G UK Index Trust",Month.class);
        timeseries1.add(
new Month(22001), 129.6D);
        timeseries1.add(
new Month(32001), 123.2D);
        timeseries1.add(
new Month(42001), 117.2D);
        timeseries1.add(
new Month(52001), 124.1D);
        timeseries1.add(
new Month(62001), 122.6D);
        timeseries1.add(
new Month(72001), 119.2D);
        timeseries1.add(
new Month(82001), 116.5D);
        timeseries1.add(
new Month(92001), 112.7D);
        timeseries1.add(
new Month(102001), 101.5D);
        timeseries1.add(
new Month(112001), 106.1D);
        timeseries1.add(
new Month(122001), 110.3D);
        timeseries1.add(
new Month(12002), 111.7D);
        timeseries1.add(
new Month(22002), 111D);
        timeseries1.add(
new Month(32002), 109.6D);
        timeseries1.add(
new Month(42002), 113.2D);
        timeseries1.add(
new Month(52002), 111.6D);
        timeseries1.add(
new Month(62002), 108.8D);
        timeseries1.add(
new Month(72002), 101.6D);
        TimeSeriesCollection timeseriescollection 
= new TimeSeriesCollection();
        timeseriescollection.addSeries(timeseries);
        timeseriescollection.addSeries(timeseries1);
        timeseriescollection.setDomainIsPointsInTime(
true); //domain軸上的刻度點代表的是時間點而不是時間段
        return timeseriescollection;
    }

   2、由ChartFactory  產(chǎn)生 JFreeChart 對象 
   
 private static JFreeChart createChart(XYDataset xydataset)
    
{
        JFreeChart jfreechart 
= ChartFactory.createTimeSeriesChart("Legal & General Unit Trust Prices"
                                                                   
"Date"
                                                                   
"Price Per Unit"
                                                                   xydataset, 
                                                                   
true
                                                                   
true
                                                                   
false);
        jfreechart.setBackgroundPaint(Color.white);
        XYPlot xyplot 
= (XYPlot)jfreechart.getPlot(); //獲得 plot : XYPlot!!
        xyplot.setBackgroundPaint(Color.lightGray);
        xyplot.setDomainGridlinePaint(Color.white);
        xyplot.setRangeGridlinePaint(Color.white);
        xyplot.setAxisOffset(
new RectangleInsets(5D, 5D, 5D, 5D));
        xyplot.setDomainCrosshairVisible(
true);
        xyplot.setRangeCrosshairVisible(
true);
        org.jfree.chart.renderer.xy.XYItemRenderer xyitemrenderer 
= xyplot.getRenderer();
        
if(xyitemrenderer instanceof XYLineAndShapeRenderer)
        
{
            XYLineAndShapeRenderer xylineandshaperenderer 
= (XYLineAndShapeRenderer)xyitemrenderer;
            xylineandshaperenderer.setDefaultShapesVisible(
true); //數(shù)據(jù)點可見
            xylineandshaperenderer.setDefaultShapesFilled(true);  //數(shù)據(jù)點是實心點
        }

        DateAxis dateaxis 
= (DateAxis)xyplot.getDomainAxis(); //對domain 軸上日期顯示格式定義
        dateaxis.setDateFormatOverride(new SimpleDateFormat("MMM-yyyy"));
        
return jfreechart;
}
   
       一些重要的方法:
     A、增加標記線: 
        xyplot.addRangeMarker(new ValueMarker(550D)); //數(shù)值軸
        Quarter quarter = new Quarter(2, 2002);
        xyplot.addDomainMarker(new ValueMarker(quarter.getMiddleMillisecond()));  //時間軸
     B、數(shù)據(jù)點的調(diào)整
        XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
        xylineandshaperenderer.setDefaultShapesVisible(true);  //數(shù)據(jù)點可見
        xylineandshaperenderer.setSeriesFillPaint(0, Color.red);  //數(shù)據(jù)點填充為紅色
        xylineandshaperenderer.setSeriesFillPaint(1, Color.white);  //數(shù)據(jù)點填充為白色
        xylineandshaperenderer.setUseFillPaint(true);    //應(yīng)用
     C、平均值曲線 
       這個曲線有什么用呢?很簡單的例子,這里有一個以半年每天為單位的數(shù)據(jù)繪制的曲線,我們想看看以月為單位數(shù)據(jù)
       的變化,這時就可以用到它了。 
        TimeSeries timeseries = createEURTimeSeries();  //就是以半年每天為單位的數(shù)據(jù)
        TimeSeries timeseries1 = MovingAverage.createMovingAverage(timeseries, 
                                                                   "30 day moving average", 
                                                                   30, //30天為一個周期
                                                                   30); //最開始的30天跳過
        TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
        timeseriescollection.addSeries(timeseries);
        timeseriescollection.addSeries(timeseries1);
        return timeseriescollection; 
     
六、總結(jié)一下
                           dataset                          plot                    renderer                       
  餅圖           PieDataset(DefaultPieDataset)           PiePlot                    ------
  柱狀圖    CatagoryDataset(DefaultCategoryDataset)    CategoryPlot                BarRenderer
  折線圖    CatagoryDataset(DefaultCategoryDataset)    CategoryPlot              LineAndShapeRenderer
                  XYDataset(XYSeriesCollection)           XYPlot                XYLineAndShapeRenderer
  時間序列圖     XYDataset (TimeSeriesCollection)         XYPlot                XYLineAndShapeRenderer



七、Item Lable 
   這里以柱狀圖為例說明,具體來說就是在每個柱狀上顯示它的數(shù)據(jù),具體有下面內(nèi)容:
   A、使 Item Lable 可見
   B、調(diào)整 Item Lable 的顏色、字體等
   C、調(diào)整 Item Lable 的位置
   D、定制 Item Lable 的內(nèi)容
   1、分配一個 Lable Generator 給 renderer
      BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer();
      GategoryLableGenerator generator =new StandardGategoryLableGenerator(
           "{2}", new DecimalFormat("0.00")    //調(diào)整顯示的數(shù)字和字符格式
      );
      barrenderer.setLableGenerator(generator);
   2、使 Item Lable 可見
      barrenderer.setItemLableVisible(true);
   3、調(diào)整 Item Lable 的顏色、字體等
      barrenderer.setItemLablePaint(Color.red);
      barrenderer.setItemLableFont(new Font("SansSerif",Font.PLAIN,10));
   4、調(diào)整 Item Lable 的位置
      這里涉及到一個新的對象 ItemLablePosition , ItemLablePosition的構(gòu)造函數(shù)有兩個或四個參數(shù)
      public ItemLabelPosition(ItemLabelAnchor itemLabelAnchor,
                         org.jfree.ui.TextAnchor textAnchor,
                         org.jfree.ui.TextAnchor rotationAnchor,
                         double angle)
      itemLabelAnchor - Item Lable 的位置 (最重要的!!)
      textAnchor - Item Lable里包含的正文相對于Item Lable 的位置
      rotationAnchor - Item Lable里包含的正文旋轉(zhuǎn)的位置
      angle - 旋轉(zhuǎn)的角度
      ItemLabelPosition itemlabelposition = new ItemLabelPosition(ItemLabelAnchor.INSIDE12, 
                                                      TextAnchor.CENTER_RIGHT, 
                                                      TextAnchor.CENTER_RIGHT, 
                                                      -1.57D);
      barrenderer.setPositiveItemLabelPosition(itemlabelposition); 
   這樣就可以每個柱狀上顯示它的數(shù)據(jù)了,當然可以定制 Item Lable 的內(nèi)容,比如 Item Lable text 超過100的才
   顯示,這樣就需要定制自己的類,它要實現(xiàn)GategoryLableGenerator 接口,實現(xiàn)generateItemLable()方法。
   
了解了jFreeChart ,現(xiàn)在要使用cewolf 。具體在web 中如何配置,就不說了。首先也是了解cewolf 工作的流程,然后對
它的標簽進行說明.

一、cewolf 產(chǎn)生圖形的流程
   創(chuàng)建一個數(shù)據(jù)源(dataset)來包含將要在圖形中顯示的數(shù)據(jù)?????>><cewolf:chart/>標簽對圖形進行調(diào)整
   ??????>><cewolf:img/>標簽把圖形輸出
 1、創(chuàng)建一個數(shù)據(jù)源(dataset)
   創(chuàng)建數(shù)據(jù)源基本上和上面一樣,所不同的是 cewolf 對其重新進行了包裝,它提供了一個DatasetProducer 接口,你需要
   實現(xiàn)這一接口,下面是一個例子
  DatasetProducer timeData = new DatasetProducer() {
    public Object produceDataset(Map params) {  //cewolf 對其重新進行了包裝
      TimeSeries ts = new TimeSeries("Cewolf Release Schedule", Month.class);//怎么樣?和上面一樣吧
      ts.add(new Month(7, 2002), 0.1);
      ts.add(new Month(8, 2002), 0.4);
      ts.add(new Month(9, 2002), 0.9);
      ts.add(new Month(10, 2002), 1.0);
      return new TimeSeriesCollection(ts);
    }
    public String getProducerId() {  //返回唯一的ID
      return "TimeDataProducer";
    }
    public boolean hasExpired(Map params, Date since) { //默認就好
      return false;
    }
  };
  pageContext.setAttribute("timeData", timeData); //產(chǎn)生完以后要把它放到頁面中保存以給 cewolf標簽調(diào)用
 2、<cewolf:chart/>標簽
  <cewolf:chart id="timeChart"     //這個id要唯一,給下邊<cewolf:img/>標簽引用
                title="TimeSeries"  //圖形的標題
                type="timeseries"   //圖形的類型 
                xaxislabel="x-values"    //橫軸 Lable
                yaxislabel="y-values">   //縱軸Lable
    <cewolf:colorpaint color="#EEEEFF"/>  //圖形的背景色
    <cewolf:data>
        <cewolf:producer id="timeData"/>  //引用上面產(chǎn)生的數(shù)據(jù)
    </cewolf:data>
  </cewolf:chart> 
  一些說明:
  關(guān)于圖形的背景色,還有兩個選擇,分別是
    <cewolf:gradientpaint>   //產(chǎn)生色彩傾斜的背景
        <cewolf:point x="0" y="0" color="#AAAAFFEE" />
        <cewolf:point x="300" y="0" color="#DDDDFF" />
    </cewolf:gradientpaint>
  和
    <cewolf:texturepaint image="/img/bg.jpg" width="60" height="60" /> //加入背景圖案
 3、<cewolf:img/>標簽
   <cewolf:img chartid="timeChart"   //就是上面那個 id
               renderer="/cewolf"    //這個是必需的!web.xml 中有配置
               width="300"         //寬
               height="300" />      //高
   還有一種圖形輸出方式:
  <img src='<cewolf:imgurl chartid="foobar" renderer="/cewolf" width="100" height="100"/>'>
  很明顯,這種方式把圖形包含到 Html 的<img/>中
 4、進一步調(diào)整
   看到上面的步驟,你可能會認為用 cewolf 輸出圖形是如此的簡單,是這樣的,但看了最開始的 jFreeChart 對圖形
   的一些調(diào)整,你會想我如何調(diào)整呢?我不想用默認值,我想輸出更復雜的圖形。很好,我是這樣做的:
   這里要介紹一個新的接口ChartPostProcessor  和一個標簽<cewolf:chartpostprocessor/>
   我們要寫自己的類實現(xiàn)這個ChartPostProcessor 接口,然后再用標簽<cewolf:chartpostprocessor/>調(diào)用我們所寫
   的類
  ChartPostProcessor dataColor = new ChartPostProcessor() {
    public void processChart(Object chart, Map params) {  //這個接口就這一個方法
      CategoryPlot plot = (CategoryPlot) ((JFreeChart) chart).getPlot(); //看到了什么??!!對,獲得了plot!
                                                                 下面就可以通過plot 對圖形進行調(diào)整!!          
      plot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));  //一個實驗,坐標軸與圖分離
      for (int i = 0; i < params.size(); i++) {   //這里的params 是通過標簽<cewolf:chartpostprocessor/>輸入的!
        String colorStr = (String) params.get(String.valueOf(i));
        plot.getRenderer().setSeriesPaint(i, java.awt.Color.decode(colorStr));//看到 renderer了吧,又可以大
                                                                                干一場了,嘿嘿!
      }
    }
  };
  pageContext.setAttribute("dataColor", dataColor); //記得要放起來噢
  具體引用:
<cewolf:chart id="stackedHorizontalBar" title="StackedHorizontalBar" 
              type="stackedHorizontalBar" xaxislabel="Fruit" yaxislabel="favorite">
    <cewolf:data>
        <cewolf:producer id="categoryData" />
    </cewolf:data>
    <cewolf:chartpostprocessor id="dataColor">   //在這里!!
        <cewolf:param name="0" value='<%= "#FFFFAA" %>'/>
        <cewolf:param name="1" value='<%= "#AAFFAA" %>'/>
        <cewolf:param name="2" value='<%= "#FFAAFF" %>'/>
        <cewolf:param name="3" value='<%= "#FFAAAA" %>'/>
    </cewolf:chartpostprocessor>
</cewolf:chart>  
 我們當然也可以在實現(xiàn)ChartPostProcessor 接口的類里把一切都做好,然后這么用:
    <cewolf:chartpostprocessor id="dataColor"/>