<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    分享java帶來的快樂

    我喜歡java新東西

    JFreeChart教程

    一、jFreeChart產生圖形的流程
    創(chuàng)建一個數據源(dataset)來包含將要在圖形中顯示的數據>>創(chuàng)建一個 JFreeChart 對象來代表要顯示的圖形
    >>把圖形輸出
    重要的類和接口:
    org.jfree.data.general.Dataset 所有數據源類都要實現(xiàn)的接口
    org.jfree.chart.ChartFactory 由它來產生 JFreeChart 對象
    org.jfree.chart.JFreeChart 所有對圖形的調整都是通過它噢!!
    org.jfree.chart.plot.Plot 通過JFreeChart 對象獲得它,然后再通過它對圖形外部部分(例:坐標軸)調整
    注意:它有很多子類,一般都下嗍造型到它的子類!
    org.jfree.chart.renderer.AbstractRenderer 通過JFreeChart 對象獲得它,然后再通過它對圖形內部部分
    (例:折線的類型)調整。同樣,針對不同類型的報表圖,它有
    著不同的子類實現(xiàn)!在下面我們簡稱它為 Renderer
    下面我們結合不同類型的圖形來具體分析這個流程。

    二、餅圖
    餅圖的dataset 一般是用PieDataset 接口,具體實現(xiàn)類是 DefaultPieDataset
    1、創(chuàng)建一個數據源(dataset):
    private static PieDataset createDataset()
    {
    DefaultPieDataset defaultpiedataset = new DefaultPieDataset(); //注意是DefaultPieDataset!!
    defaultpiedataset.setValue(”O(jiān)ne”, 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 產生 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?。?br />pieplot.setNoDataMessage(”No data available”); // 沒有數據的時候顯示的內容
    return jfreechart;
    }
    一些重要的方法:
    pieplot.setExplodePercent(0,0.3D) //把Lable 為”O(jiān)ne” 的那一塊”挖”出來30%
    3、輸出略

    三、柱狀圖
    柱狀圖的dataset 一般是用CatagoryDataset接口(具體實現(xiàn)類是DefaultCategoryDataset),也會用 IntervalXYDataset
    接口
    1、創(chuàng)建一個數據源(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 產生 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); //設定背景色為白色
    CategoryPlot categoryplot = jfreechart.getCategoryPlot(); //獲得 plot:CategoryPlot??!
    categoryplot.setBackgroundPaint(Color.lightGray); //設定圖表數據顯示部分背景色
    categoryplot.setDomainGridlinePaint(Color.white); //橫坐標網格線白色
    categoryplot.setDomainGridlinesVisible(true); //可見
    categoryplot.setRangeGridlinePaint(Color.white); //縱坐標網格線白色
    //下面兩行使縱坐標的最小單位格為整數
    NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();
    numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
    BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer(); //獲得renderer 注意這里是下嗍造型
    到BarRenderer?。?br />barrenderer.setDrawBarOutline(false); // Bar的外輪廓線不畫
    GradientPaint gradientpaint = new GradientPaint(0.0F, 0.0F, Color.blue,
    0.0F, 0.0F, new Color(0, 0, 64)); //設定特定顏色
    GradientPaint gradientpaint1 = new GradientPaint(0.0F, 0.0F, Color.green,
    0.0F, 0.0F, new Color(0, 64, 0));
    GradientPaint gradientpaint2 = new GradientPaint(0.0F, 0.0F, Color.red,
    0.0F, 0.0F, new Color(64, 0, 0));
    barrenderer.setSeriesPaint(0, gradientpaint); //給series1 Bar設定上面定義的顏色
    barrenderer.setSeriesPaint(1, gradientpaint1); //給series2 Bar 設定上面定義的顏色
    barrenderer.setSeriesPaint(2, gradientpaint2); //給series3 Bar 設定上面定義的顏色
    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)建一個數據源(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 產生 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 點(即數據點)可見
    lineandshaperenderer.setSeriesStroke(0, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {
    10F, 6F
    }, 0.0F)); //定義series為”First”的(即series1)點之間的連線 ,這里是虛線,默認是直線
    lineandshaperenderer.setSeriesStroke(1, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {
    6F, 6F
    }, 0.0F)); //定義series為”Second”的(即series2)點之間的連線
    lineandshaperenderer.setSeriesStroke(2, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {
    2.0F, 6F
    }, 0.0F)); //定義series為”Third”的(即series3)點之間的連線
    return jfreechart;
    }
    一些重要的方法:
    lineandshaperenderer.setLineVisible(true) //series 點(即數據點)間有連線可見
    2、XYDataset 接口:
    A、創(chuàng)建一個數據源(dataset):
    private static XYDataset createDataset()
    {
    XYSeries xyseries = new XYSeries(”First”); //先產生XYSeries 對象
    xyseries.add(1.0D, 1.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 產生 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); //設定圖表數據顯示部分背景色
    xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); //設定坐標軸與圖表數據顯示部分距離
    xyplot.setDomainGridlinePaint(Color.white); //網格線顏色
    xyplot.setRangeGridlinePaint(Color.white);
    //獲得 renderer 注意這里是XYLineAndShapeRenderer !!
    XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
    xylineandshaperenderer.setShapesVisible(true); //數據點可見
    xylineandshaperenderer.setShapesFilled(true); //數據點被填充即不是空心點
    NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis();
    numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
    return jfreechart;
    }
    一些重要的方法:
    XYLineAndShapeRenderer xylineandshaperenderer = new XYLineAndShapeRenderer();
    xylineandshaperenderer.setSeriesLinesVisible(0, false); //第一個XYSeries數據點間連線不可見
    xylineandshaperenderer.setSeriesShapesVisible(1, false); //第二個XYSeries數據點不可見
    xyplot.setRenderer(xylineandshaperenderer);

    五、時間序列圖
    時間序列圖和折線圖很相似,不同的是它在 domain軸的數據是時間而不是數字。 時間序列圖的dataset 是
    XYDataset 接口,具體實現(xiàn)類是TimeSeriesCollection ,和上面類似,有TimeSeries 對象,它被添加入
    TimeSeriesCollection 。
    1、創(chuàng)建一個數據源(dataset):
    private static XYDataset createDataset()
    {
    TimeSeries timeseries = new TimeSeries(”L&G European Index Trust”,Month.class);
    timeseries.add(new Month(2, 2001), 181.8D);//這里用的是Month.class,同樣還有Day.class Year.class 等等
    timeseries.add(new Month(3, 2001), 167.3D);
    timeseries.add(new Month(4, 2001), 153.8D);
    timeseries.add(new Month(5, 2001), 167.6D);
    timeseries.add(new Month(6, 2001), 158.8D);
    timeseries.add(new Month(7, 2001), 148.3D);
    timeseries.add(new Month(8, 2001), 153.9D);
    timeseries.add(new Month(9, 2001), 142.7D);
    timeseries.add(new Month(10, 2001), 123.2D);
    timeseries.add(new Month(11, 2001), 131.8D);
    timeseries.add(new Month(12, 2001), 139.6D);
    timeseries.add(new Month(1, 2002), 142.9D);
    timeseries.add(new Month(2, 2002), 138.7D);
    timeseries.add(new Month(3, 2002), 137.3D);
    timeseries.add(new Month(4, 2002), 143.9D);
    timeseries.add(new Month(5, 2002), 139.8D);
    timeseries.add(new Month(6, 2002), 137D);
    timeseries.add(new Month(7, 2002), 132.8D);

    TimeSeries timeseries1 = new TimeSeries(”L&G UK Index Trust”,Month.class);
    timeseries1.add(new Month(2, 2001), 129.6D);
    timeseries1.add(new Month(3, 2001), 123.2D);
    timeseries1.add(new Month(4, 2001), 117.2D);
    timeseries1.add(new Month(5, 2001), 124.1D);
    timeseries1.add(new Month(6, 2001), 122.6D);
    timeseries1.add(new Month(7, 2001), 119.2D);
    timeseries1.add(new Month(8, 2001), 116.5D);
    timeseries1.add(new Month(9, 2001), 112.7D);
    timeseries1.add(new Month(10, 2001), 101.5D);
    timeseries1.add(new Month(11, 2001), 106.1D);
    timeseries1.add(new Month(12, 2001), 110.3D);
    timeseries1.add(new Month(1, 2002), 111.7D);
    timeseries1.add(new Month(2, 2002), 111D);
    timeseries1.add(new Month(3, 2002), 109.6D);
    timeseries1.add(new Month(4, 2002), 113.2D);
    timeseries1.add(new Month(5, 2002), 111.6D);
    timeseries1.add(new Month(6, 2002), 108.8D);
    timeseries1.add(new Month(7, 2002), 101.6D);
    TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
    timeseriescollection.addSeries(timeseries);
    timeseriescollection.addSeries(timeseries1);
    timeseriescollection.setDomainIsPointsInTime(true); //domain軸上的刻度點代表的是時間點而不是時間段
    return timeseriescollection;
    }
    2、由ChartFactory 產生 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); //數據點可見
    xylineandshaperenderer.setDefaultShapesFilled(true); //數據點是實心點
    }
    DateAxis dateaxis = (DateAxis)xyplot.getDomainAxis(); //對domain 軸上日期顯示格式定義
    dateaxis.setDateFormatOverride(new SimpleDateFormat(”MMM-yyyy”));
    return jfreechart;
    }
    一些重要的方法:
    A、增加標記線:
    xyplot.addRangeMarker(new ValueMarker(550D)); //數值軸
    Quarter quarter = new Quarter(2, 2002);
    xyplot.addDomainMarker(new ValueMarker(quarter.getMiddleMillisecond())); //時間軸
    B、數據點的調整
    XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
    xylineandshaperenderer.setDefaultShapesVisible(true); //數據點可見
    xylineandshaperenderer.setSeriesFillPaint(0, Color.red); //數據點填充為紅色
    xylineandshaperenderer.setSeriesFillPaint(1, Color.white); //數據點填充為白色
    xylineandshaperenderer.setUseFillPaint(true); //應用
    C、平均值曲線
    這個曲線有什么用呢?很簡單的例子,這里有一個以半年每天為單位的數據繪制的曲線,我們想看看以月為單位數據
    的變化,這時就可以用到它了。
    TimeSeries timeseries = createEURTimeSeries(); //就是以半年每天為單位的數據
    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;

    六、總結一下
    dataset plot renderer
    餅圖 PieDataset(DefaultPieDataset) PiePlot ——
    柱狀圖 CatagoryDataset(DefaultCategoryDataset) CategoryPlot BarRenderer
    折線圖 CatagoryDataset(DefaultCategoryDataset) CategoryPlot LineAndShapeRenderer
    XYDataset(XYSeriesCollection) XYPlot XYLineAndShapeRenderer
    時間序列圖 XYDataset (TimeSeriesCollection) XYPlot XYLineAndShapeRenderer
    這里只是一些常用的方法,具體還是看API
    七、Item Lable
    這里以柱狀圖為例說明,具體來說就是在每個柱狀上顯示它的數據,具體有下面內容:
    A、使 Item Lable 可見
    B、調整 Item Lable 的顏色、字體等
    C、調整 Item Lable 的位置
    D、定制 Item Lable 的內容
    1、分配一個 Lable Generator 給 renderer
    BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer();
    GategoryLableGenerator generator =new StandardGategoryLableGenerator(
    “{2}”, new DecimalFormat(”0.00″) //調整顯示的數字和字符格式
    );
    barrenderer.setLableGenerator(generator);
    2、使 Item Lable 可見
    barrenderer.setItemLableVisible(true);
    3、調整 Item Lable 的顏色、字體等
    barrenderer.setItemLablePaint(Color.red);
    barrenderer.setItemLableFont(new Font(”SansSerif”,Font.PLAIN,10));
    4、調整 Item Lable 的位置
    這里涉及到一個新的對象 ItemLablePosition , ItemLablePosition的構造函數有兩個或四個參數
    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里包含的正文旋轉的位置
    angle - 旋轉的角度
    ItemLabelPosition itemlabelposition = new ItemLabelPosition(ItemLabelAnchor.INSIDE12,
    TextAnchor.CENTER_RIGHT,
    TextAnchor.CENTER_RIGHT,
    -1.57D);
    barrenderer.setPositiveItemLabelPosition(itemlabelposition);
    這樣就可以每個柱狀上顯示它的數據了,當然可以定制 Item Lable 的內容,比如 Item Lable text 超過100的才
    顯示,這樣就需要定制自己的類,它要實現(xiàn)GategoryLableGenerator 接口,實現(xiàn)generateItemLable()方法

    posted on 2006-08-02 12:42 強強 閱讀(31403) 評論(6)  編輯  收藏 所屬分類: Java

    評論

    # re: JFreeChart教程 2007-11-13 00:30 W.R.F

    謝謝你的教程!  回復  更多評論   

    # re: JFreeChart教程 2009-06-08 16:15 fllxyz

    頂,謝謝  回復  更多評論   

    # re: JFreeChart教程 2010-03-08 10:38 梁吉超

    太感謝了  回復  更多評論   

    # re: JFreeChart教程 2011-01-25 14:24 sane

    非常詳細,非常感謝!  回復  更多評論   

    # re: JFreeChart教程 2011-03-07 17:20 lethe

    謝謝  回復  更多評論   

    # re: JFreeChart教程[未登錄] 2012-07-01 15:22 lcc

    非常感謝,教程挺好的  回復  更多評論   

    主站蜘蛛池模板: 国产成人免费手机在线观看视频| 日韩精品视频在线观看免费| 国产色爽免费无码视频| 亚洲一级毛片在线播放| 亚洲免费在线播放| 亚洲天堂在线播放| 中国xxxxx高清免费看视频| 亚洲一区二区在线免费观看| 69视频在线观看免费| 亚洲成人黄色网址| AV片在线观看免费| 国产精品亚洲专区无码牛牛| 免费大片黄手机在线观看| eeuss草民免费| 亚洲精品无码永久中文字幕| 中文字幕乱码一区二区免费| 亚洲毛片在线观看| 黄瓜视频影院在线观看免费| 亚洲国产精品无码观看久久| 久久久精品2019免费观看 | 精品国产人成亚洲区| eeuss在线兵区免费观看| 亚洲精品无码国产| 国产大片91精品免费观看不卡| 国产 亚洲 中文在线 字幕| 波多野结衣免费一区视频 | 亚洲欧洲日产国码久在线| 国产美女精品久久久久久久免费| 黄色毛片免费网站| 亚洲av永久无码制服河南实里| 黄页网址大全免费观看12网站 | 亚洲最新视频在线观看| 日韩一区二区a片免费观看| 精品在线免费视频| 亚洲AV无码一区二区乱子伦| 国产免费久久精品99re丫y| 亚洲va久久久噜噜噜久久| 全免费毛片在线播放| 人人鲁免费播放视频人人香蕉| 亚洲色图校园春色| 亚洲第一页综合图片自拍|