jfreechart圖表在web頁面中添加鼠標懸浮效果

package com.servlet.report;

import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

import com.servlet.dbcp.DBCPTools;

public class JfreeChartServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

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

	public  void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setCharacterEncoding("UTF-8");
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		String db = request.getParameter("db");
		String sql = request.getParameter("sql");
		String title = request.getParameter("title");
		String type = request.getParameter("type");
		String categoryLabel = request.getParameter("categoryLabel");
		String valueLabel = request.getParameter("valueLabel");
		String rowLabel = request.getParameter("rowLabel");
		String columnLabel = request.getParameter("columnLabel");
		String columnValue = request.getParameter("columnValue");
		int width = Integer.parseInt(request.getParameter("width").toString());
		int height = Integer
				.parseInt(request.getParameter("height").toString());
		String fileName = "";
		try {
			fileName = this.drawToHtml(getChart(db, sql, title, type,
					categoryLabel, valueLabel, rowLabel, columnLabel,
					columnValue), request.getSession(), response.getWriter(),
					width, height);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		String myImg = "<img id='myImg' src='/servlet/DisplayChart?filename="
				+ fileName + "' usemap='#" + fileName + "'  border='0'>";
		response.getWriter().print(myImg);
	}

	public JFreeChart getChart(String db, String sql, String title,
			String type, String categoryLabel, String valueLabel,
			String rowLabel, String columnLabel, String columnValue)
			throws SQLException {
		JFreeChart chart = null;
		Font myFont = new Font("黑體", Font.BOLD, 14);
		if ("pie".equals(type)) {
			chart = ChartFactory.createPieChart3D(title, createPieDataset(db,
					sql, rowLabel, columnLabel), true, true, false);
			PiePlot localPiePlot = (PiePlot) chart.getPlot();
			localPiePlot.setLabelFont(myFont);
			localPiePlot.setNoDataMessage("沒有數據");
			localPiePlot.setCircular(false);
			localPiePlot.setLabelGap(0.02D);
		} else if ("bar".equals(type)) {
			chart = ChartFactory.createBarChart3D(title, categoryLabel,
					valueLabel, createDataset(db, sql, rowLabel, columnLabel,
							columnValue), PlotOrientation.VERTICAL, true, true,
					false);
			CategoryPlot localCategoryPlot = (CategoryPlot) chart.getPlot();
			CategoryAxis domainAxis = localCategoryPlot.getDomainAxis();
			// 設置水平底部列表
			domainAxis.setLabelFont(myFont);
			// 設置水平底部標題
			domainAxis.setTickLabelFont(myFont);
			domainAxis
					.setCategoryLabelPositions(CategoryLabelPositions.STANDARD);
			// 設置錘子標題
			ValueAxis rangeAxis = localCategoryPlot.getRangeAxis();
			rangeAxis.setLabelFont(myFont);
			CategoryItemRenderer localCategoryItemRenderer = localCategoryPlot
					.getRenderer();
			localCategoryItemRenderer.setBaseItemLabelsVisible(true);
			BarRenderer localBarRenderer = (BarRenderer) localCategoryItemRenderer;
			localBarRenderer.setItemMargin(0.20000000000000001D);
		} else if (type.equals("aear")) {
			chart = ChartFactory.createStackedAreaChart(title, categoryLabel,
					valueLabel, createDataset(db, sql, rowLabel, columnLabel,
							columnValue), PlotOrientation.VERTICAL, true, true,
					false);
			chart.setBackgroundPaint(Color.white);
			CategoryPlot localCategoryPlot = (CategoryPlot) chart.getPlot();
			CategoryAxis localCategoryAxis = localCategoryPlot.getDomainAxis();
			localCategoryAxis.setLabelFont(myFont);
			// 設置水平底部標題
			localCategoryAxis.setTickLabelFont(myFont);
			localCategoryAxis
					.setCategoryLabelPositions(CategoryLabelPositions.STANDARD);
			// 設置錘子標題
			ValueAxis rangeAxis = localCategoryPlot.getRangeAxis();
			rangeAxis.setLabelFont(myFont);
		} else if (type.equals("line")) {
			chart = ChartFactory.createXYLineChart(title, categoryLabel,
					valueLabel, createXYDataset(db, sql, rowLabel, columnLabel,
							columnValue), PlotOrientation.VERTICAL, true, true,
					false);
			XYPlot localXYPlot = (XYPlot) chart.getPlot();
			// 設置X軸顯示漢字字體
			ValueAxis domainAxis = localXYPlot.getDomainAxis();
			domainAxis.setLabelFont(myFont);
			XYLineAndShapeRenderer localXYLineAndShapeRenderer = (XYLineAndShapeRenderer) localXYPlot
					.getRenderer();
			localXYLineAndShapeRenderer.setBaseShapesVisible(true);
			localXYLineAndShapeRenderer.setBaseShapesFilled(true);
			// 設置Y軸顯示漢字字體
			NumberAxis localNumberAxis = (NumberAxis) localXYPlot
					.getRangeAxis();
			localNumberAxis.setLabelFont(myFont);
			localNumberAxis.setStandardTickUnits(NumberAxis
					.createIntegerTickUnits());
		}
		chart.setTitle(new TextTitle(title, new Font("黑體", Font.ITALIC, 22)));
		// 設置圖例的字體==爲了防止中文亂碼:必須設置字體
		chart.getLegend().setItemFont(new Font("黑體", Font.BOLD, 12));
		return chart;
	}

	public String drawToHtml(JFreeChart chart, HttpSession session,
			PrintWriter out, int width, int height) {
		ChartRenderingInfo info = new ChartRenderingInfo(
				new StandardEntityCollection());
		String fileName = "";
		try {
			fileName = ServletUtilities.saveChartAsPNG(chart, width, height,
					info, session);// 生成圖片
			// Write the image map to the PrintWriter
			ChartUtilities.writeImageMap(out, fileName, info, false);
		} catch (IOException e) {
			e.printStackTrace();
		}
		out.flush();
		return fileName;// 返回生成圖片的文件名
	}

	private PieDataset createPieDataset(String db, String sql, String rowLabel,
			String columnLabel) throws SQLException {
		DefaultPieDataset localDefaultPieDataset = new DefaultPieDataset();
		ResultSet rs = resultSetToList(sql, db);
		while (rs.next()) {
			localDefaultPieDataset.setValue(rs.getString(rowLabel), rs
					.getDouble(columnLabel));
		}
		rs.close();
		return localDefaultPieDataset;
	}

	private CategoryDataset createDataset(String db, String sql,
			String rowLabel, String columnLabel, String columnValue)
			throws SQLException {
		DefaultCategoryDataset localDefaultCategoryDataset = new DefaultCategoryDataset();
		ResultSet rs = resultSetToList(sql, db);
		while (rs.next()) {
			localDefaultCategoryDataset.addValue(rs.getDouble(columnLabel), rs.getString(rowLabel), rs
					.getString(columnValue));
		}
		rs.close();
		return localDefaultCategoryDataset;
	}

	private static XYDataset createXYDataset(String db, String sql,
			String rowLabel, String columnLabel, String columnValue)
			throws SQLException {
		XYSeriesCollection localXYSeriesCollection = new XYSeriesCollection();
		ResultSet rs = resultSetToList(sql, db);
		XYSeries localXYSeries1 = null;
		rs.next();
		String temp = rs.getString(columnValue);
		if (temp != null && !("").equals(temp)) {
			localXYSeries1 = new XYSeries(temp);
			localXYSeries1.add(rs.getDouble(rowLabel), rs
					.getDouble(columnLabel));
		}
		while (rs.next()) {
			if (rs.getString(columnValue).equals(temp)) {
				localXYSeries1.add(rs.getDouble(rowLabel), rs
						.getDouble(columnLabel));
			} else {
				localXYSeriesCollection.addSeries(localXYSeries1);
				localXYSeries1 = new XYSeries(rs.getString(columnValue));
				temp = rs.getString(columnValue);
				localXYSeries1.add(rs.getDouble(rowLabel), rs
						.getDouble(columnLabel));
			}
		}
		if (localXYSeries1 != null) {
			localXYSeriesCollection.addSeries(localXYSeries1);
		}
		rs.close();
		return localXYSeriesCollection;
	}

	private static ResultSet resultSetToList(String sql, String dbName)
			throws java.sql.SQLException {
		Connection con = DBCPTools.getConnectionFromDBCP(dbName);
		Statement stmt = con.createStatement();
		ResultSet rs = stmt.executeQuery(sql);
		if (rs == null)
			return null;
		return rs;
	}
}


 以上是java類

下面是展示圖表jsp頁面代碼

<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>Insert title here</title>
  <script type="text/javascript">
function loadFile(){
    var txtFrame=document.getElementById("txtFrame").value;
 var returnStr =eval( "(" + parent.workfloweditor.xmldocument.getJfreechart(txtFrame)+ ")" );
 var outText=new  parent.jsx3.ide.DBConn().jfreeChartServlet(returnStr,document.body.clientWidth,parent.document.body.clientHeight);//本項目用的ajax代碼
 document.getElementById("div1").innerHTML=outText;
}
</script>
 </head>
 <body οnlοad="loadFile()">
 <input id="txtFrame" type="hidden" value="<%=request.getParameter("frame") %>">
 <div id="div1"></div>
 </body>
</html>

 

 

發佈了19 篇原創文章 · 獲贊 17 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章