JFreeChart入門


JFreeChart主要用來各種各樣的圖表,這些圖表包括:餅圖、柱狀圖(普通柱狀圖以及堆棧柱狀圖)、線圖、區域圖、分布圖、混合圖、甘特圖以及一些儀表盤等等

(源代碼下載)

示例程序運用的jar包:

  • jcommon-1.0.17.jar
  • jfreechart-1.0.14.jar

1:普通柱狀圖

這是程序調用CategoryDataset dataset = getDataSet2(); 后所生產的圖片

BarChartDemo.java柱狀圖代碼

/** 
* 該類用於演示最簡單的柱狀圖生成
* @author Winter Lau 
*/ 
public class BarChartDemo { 
    public static void main(String[] args) throws IOException{ 
        
        CategoryDataset dataset = getDataSet2(); 
        JFreeChart chart = ChartFactory.createBarChart3D( 
                           "水果產量圖", // 圖表標題
                           "水果", // 目錄軸的顯示標簽
                           "產量", // 數值軸的顯示標簽
                            dataset, // 數據集
                            PlotOrientation.VERTICAL, // 圖表方向:水平、垂直
                            true,  // 是否顯示圖例(對於簡單的柱狀圖必須是 false)
                            false, // 是否生成工具
                            false  // 是否生成 URL 鏈接
                            ); 
        //中文亂碼
        CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
        NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();  
        CategoryAxis domainAxis = categoryplot.getDomainAxis();  
        TextTitle textTitle = chart.getTitle();
        textTitle.setFont(new Font("黑體", Font.PLAIN, 20));      
        domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));  
        domainAxis.setLabelFont(new Font("宋體", Font.PLAIN, 12));  
        numberaxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));  
        numberaxis.setLabelFont(new Font("黑體", Font.PLAIN, 12));  
        chart.getLegend().setItemFont(new Font("宋體", Font.PLAIN, 12));
                           
        FileOutputStream fos_jpg = null; 
        try { 
            fos_jpg = new FileOutputStream("D:\\BarChart.jpg"); 
            ChartUtilities.writeChartAsJPEG(fos_jpg, 1.0f,chart,400,300,null); 
        } finally { 
            try { 
                fos_jpg.close(); 
            } catch (Exception e) {} 
        } 
    } 
    /** 
    * 獲取一個演示用的簡單數據集對象
    * @return 
    */ 
    private static CategoryDataset getDataSet() { 
        DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 
        dataset.addValue(100, "", "蘋果"); 
        dataset.addValue(200, "", "梨子"); 
        dataset.addValue(300, "", "葡萄"); 
        dataset.addValue(400, "", "香蕉"); 
        dataset.addValue(500, "", "荔枝"); 
        return dataset; 
    } 
    /** 
    * 獲取一個演示用的組合數據集對象
    * @return 
    */ 
    private static CategoryDataset getDataSet2() { 
        DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 
        dataset.addValue(100, "北京", "蘋果"); 
        dataset.addValue(100, "上海", "蘋果"); 
        dataset.addValue(100, "廣州", "蘋果"); 
        dataset.addValue(200, "北京", "梨子"); 
        dataset.addValue(200, "上海", "梨子"); 
        dataset.addValue(200, "廣州", "梨子"); 
        dataset.addValue(300, "北京", "葡萄"); 
        dataset.addValue(300, "上海", "葡萄"); 
        dataset.addValue(300, "廣州", "葡萄"); 
        dataset.addValue(400, "北京", "香蕉"); 
        dataset.addValue(400, "上海", "香蕉"); 
        dataset.addValue(400, "廣州", "香蕉"); 
        dataset.addValue(500, "北京", "荔枝"); 
        dataset.addValue(500, "上海", "荔枝"); 
        dataset.addValue(500, "廣州", "荔枝"); 
        return dataset; 
    } 
} 

2:餅狀圖

PieChartDemo.java餅狀圖源代碼

/**
 * 用於演示餅圖的生成
 */
public class PieChartDemo {
    public static void main(String[] args) throws IOException {
        DefaultPieDataset data = getDataSet();
        JFreeChart chart = ChartFactory.createPieChart3D("水果產量圖", // 圖表標題
                data, // 數據集
                true, // 是否顯示圖例(對於簡單的柱狀圖必須是 false)
                false, // 是否生成工具
                false // 是否生成 URL 鏈接
                );

        //中文亂碼
        PiePlot3D plot = (PiePlot3D) chart.getPlot();
        plot.setLabelFont(new Font("黑體", Font.PLAIN, 20));
        TextTitle textTitle = chart.getTitle();
        textTitle.setFont(new Font("黑體", Font.PLAIN, 20));
        chart.getLegend().setItemFont(new Font("宋體", Font.PLAIN, 12));

        // 寫圖表對象到文件,參照柱狀圖生成源碼
        FileOutputStream fos_jpg = null;
        try {
            fos_jpg = new FileOutputStream("D:\\Pie3DChart.jpg");
            ChartUtilities.writeChartAsJPEG(fos_jpg, 1.0f, chart, 400, 300,
                    null);
        } finally {
            try {
                fos_jpg.close();
            } catch (Exception e) {
            }
        }
    }

    /**
     * 獲取一個演示用的簡單數據集對象
     * 
     * @return
     */
    private static DefaultPieDataset getDataSet() {
        DefaultPieDataset dataset = new DefaultPieDataset();
        dataset.setValue("蘋果", 100);
        dataset.setValue("梨子", 200);
        dataset.setValue("葡萄", 300);
        dataset.setValue("香蕉", 400);
        dataset.setValue("荔枝", 500);
        return dataset;
    }
}

其他的圖表類型暫時不寫了,其實寫法也差不多。這里注意兩種圖形的中文亂碼解決方法是不一樣的,具體查看源代碼中的紅色部分

3:將數據庫的內容用圖形表示出來

index.jsp

<body>
    <form action="servlet/ShowChartServlet" method="get" >
      <input type="submit" value="jfreechart訪問數據庫生成圖表">
    </form>
  </body>

showJfreeChart.jsp

<body>
    <center>
    <img alt="" src="<%=path %>/reports/productSales.jpg">
    </center>
  </body>

ShowChartServlet.java

public class ShowChartServlet extends HttpServlet {

    /**
     * 獲取一個演示用的組合數據集對象
     * 
     * @return
     */
    private static CategoryDataset getDataSet() {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        // 從數據庫中獲取
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver"); // 加載驅動程序
            conn = DriverManager
                    .getConnection(
                            "jdbc:mysql://localhost:3306/shopping?useUnicode=true&amp;characterEncoding=utf8",
                            "root", "root");
            ps = conn.prepareStatement("select p.name, count(pcount) from product p join salesitem si on (p.id = si.productid) group by p.id");
            rs = ps.executeQuery();
            while (rs.next()) {
                dataset.addValue(rs.getInt(2), "", rs.getString(1));
            }
            rs.close();
            rs = null;
        } catch (SQLException e) {
            e.printStackTrace();
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        finally {
            if(ps != null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

        }

        return dataset;
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        CategoryDataset dataset = getDataSet(); 
        JFreeChart chart = ChartFactory.createBarChart3D( 
                           "產品銷量圖", // 圖表標題
                           "產品", // 目錄軸的顯示標簽
                           "銷量", // 數值軸的顯示標簽
                            dataset, // 數據集
                            PlotOrientation.VERTICAL, // 圖表方向:水平、垂直
                            true,  // 是否顯示圖例(對於簡單的柱狀圖必須是 false)
                            false, // 是否生成工具
                            false  // 是否生成 URL 鏈接
                            ); 
        //中文亂碼
        CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
        NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();  
        CategoryAxis domainAxis = categoryplot.getDomainAxis();  
        TextTitle textTitle = chart.getTitle();
        textTitle.setFont(new Font("黑體", Font.PLAIN, 20));      
        domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));  
        domainAxis.setLabelFont(new Font("宋體", Font.PLAIN, 12));  
        numberaxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));  
        numberaxis.setLabelFont(new Font("黑體", Font.PLAIN, 12));  
        chart.getLegend().setItemFont(new Font("宋體", Font.PLAIN, 12));
                           
        FileOutputStream fos_jpg = null; 
        try { 
            fos_jpg = new FileOutputStream("E:\\Workspaces\\MyEclipse 9\\WebProjects\\JFreeChart\\WebRoot\\reports\\productSales.jpg"); 
            ChartUtilities.writeChartAsJPEG(fos_jpg, 1.0f,chart,400,300,null); 
             String path = this.getServletContext().getContextPath();
             System.out.println(path+"mmmmmmmmmmm");
            this.getServletContext().getRequestDispatcher("/showJfreeChart.jsp").forward(request, response);
        } finally { 
            try { 
                fos_jpg.close(); 
            } catch (Exception e) {} 
        } 
    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM