一、实现前效果
二、实现后效果
三、编程代码
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.apache.log4j.Logger;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.block.BlockBorder;
import org.jfree.chart.block.BlockContainer;
import org.jfree.chart.block.BorderArrangement;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.DatasetRenderingOrder;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.CompositeTitle;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.urls.CategoryURLGenerator;
import org.jfree.chart.urls.StandardCategoryURLGenerator;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.ui.RectangleEdge;
import org.jfree.ui.RectangleInsets;
import com.mln.frame.ChartAction;
import com.mln.frame.DateUtil;
import com.mln.frame.IBaseDao;
public class SunIndexChartAction extends ChartAction{
private static Logger logger = Logger.getLogger(SunIndexChartAction.class);
private IBaseDao daoSrv;
private CategoryDataset dataset;
private CategoryDataset datasetTwo;
private int width;
private int height;
private String kpiYear;
@Override
public String execute() {
try{
Map dataMap = getMonthEnergy();
String title="";
if(kpiYear!=null&&!"".equals(kpiYear)){
title= kpiYear + "年太阳能资源指标分析";
}else{
title= "太阳能资源指标分析";
}
String[] rowKeysOne = {"水平总辐射量","固定式斜面总辐射量","极轴斜面总辐射量"};
String[] rowKeysTwo = {"实际发电量"};
final int length = dataMap.entrySet().size();
String[] catekeys = new String[length];
double[][] data = new double[3][length];
int index = 0;
for(Map.Entry entry : dataMap.entrySet()){
catekeys[index] = entry.getKey();
data[0][index] = entry.getValue()[0];
data[1][index] = entry.getValue()[1];
data[2][index] = entry.getValue()[2];
index++;
}
dataset = DatasetUtilities.createCategoryDataset(rowKeysOne,catekeys,data);
String[] catekeysTwo = new String[length];
double[][] dataTwo = new double[1][length];
int indexTwo = 0;
for(Map.Entry entry : dataMap.entrySet()){
catekeysTwo[indexTwo] = entry.getKey();
dataTwo[0][indexTwo] = entry.getValue()[3];
indexTwo++;
}
datasetTwo = DatasetUtilities.createCategoryDataset(rowKeysTwo,catekeysTwo,dataTwo);
StandardChartTheme standardChartTheme=new StandardChartTheme("CN"); //设置标题字体
standardChartTheme.setExtraLargeFont(new Font("微软雅黑",Font.BOLD,15)); //设置图例的字体
standardChartTheme.setRegularFont(new Font("微软雅黑",Font.PLAIN,12)); //设置轴向的字体
standardChartTheme.setLargeFont(new Font("微软雅黑",Font.PLAIN,12)); //应用主题样式
ChartFactory.setChartTheme(standardChartTheme);
JFreeChart localJFreeChart = ChartFactory.createBarChart(title, "", "MJ/m²",dataset, PlotOrientation.VERTICAL, false, true, false);
CategoryPlot localCategoryPlot = (CategoryPlot)localJFreeChart.getPlot();
CategoryDataset localCategoryDataset = datasetTwo;
localCategoryPlot.setDataset(1, localCategoryDataset);
localCategoryPlot.mapDatasetToRangeAxis(1, 1);
localCategoryPlot.setBackgroundPaint(new Color(238, 244, 255));
NumberAxis localNumberAxis = new NumberAxis("万kWh");
localJFreeChart.setBackgroundPaint(new Color(238, 244, 255));
localCategoryPlot.setRangeAxis(1, localNumberAxis);
LineAndShapeRenderer localLineAndShapeRenderer = new LineAndShapeRenderer();
localLineAndShapeRenderer.setBaseShapesVisible(true);
localLineAndShapeRenderer.setDrawOutlines(true);
localLineAndShapeRenderer.setUseFillPaint(true);
localLineAndShapeRenderer.setBaseFillPaint(Color.white);//设置圆点颜色
localLineAndShapeRenderer.setSeriesPaint(0,Color.yellow);//设置线条颜色
localLineAndShapeRenderer.setSeriesStroke(0, new BasicStroke(3F));//设置线条粗细
localLineAndShapeRenderer.setSeriesOutlineStroke(0, new BasicStroke(2.0F));//设置圆点半径
localLineAndShapeRenderer.setSeriesShape(0, new Ellipse2D.Double(-5.0D, -5.0D, 10.0D, 10.0D)); //设置圆点位置
localLineAndShapeRenderer.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());
localCategoryPlot.setRenderer(1, localLineAndShapeRenderer);
localCategoryPlot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
LegendTitle localLegendTitle1 = new LegendTitle(localCategoryPlot.getRenderer(0));
localLegendTitle1.setMargin(new RectangleInsets(2.0D, 2.0D, 2.0D, 2.0D));
localLegendTitle1.setFrame(new BlockBorder());
LegendTitle localLegendTitle2 = new LegendTitle(localCategoryPlot.getRenderer(1));
localLegendTitle2.setMargin(new RectangleInsets(2.0D, 2.0D, 2.0D, 2.0D));
localLegendTitle2.setFrame(new BlockBorder());
BlockContainer localBlockContainer = new BlockContainer(new BorderArrangement());
localBlockContainer.add(localLegendTitle1, RectangleEdge.LEFT);
localBlockContainer.add(localLegendTitle2, RectangleEdge.RIGHT);
CompositeTitle localCompositeTitle = new CompositeTitle(localBlockContainer);
localCompositeTitle.setPosition(RectangleEdge.BOTTOM);
localJFreeChart.addSubtitle(localCompositeTitle);
//ChartUtilities.applyCurrentTheme(localJFreeChart); //设置默认主题
localJFreeChart.setBackgroundPaint(Color.white);
localCategoryPlot.setDomainGridlinesVisible(true);
localCategoryPlot.setRangeCrosshairVisible(true);
localCategoryPlot.setRangeCrosshairPaint(Color.blue);
localCategoryPlot.setDomainGridlinePaint(Color.lightGray);
localCategoryPlot.setRangeGridlinePaint(Color.lightGray);
BarRenderer barrenderer = (BarRenderer)localCategoryPlot.getRenderer(0);
CategoryURLGenerator generator = new StandardCategoryURLGenerator("sunIndexStationChart.jsp", "param1", "param2");
barrenderer.setBaseItemURLGenerator(generator);
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
ChartUtilities.writeChartAsPNG(this.getResponse().getOutputStream(), localJFreeChart, width, height, info);
String chartMap = ChartUtilities.getImageMap("SunIndexChartMap", info);
this.setSessionAttribute("SunIndexChartMap", chartMap);
return null;
}catch(Exception e){
e.printStackTrace();
this.setRequestAttribute(this.ERRMSG, e.getMessage());
logger.error(e.getLocalizedMessage());
return this.ERROR;
}
}
//根据获取12个月内所有数据
private Map getMonthEnergy(){
Map cur = new TreeMap();
Date dateNow = new java.util.Date();
int year;
int month = 0;
List monthList = new ArrayList();//初始化月份
String fyear = "";
String fmonth = "";
if(kpiYear!=null&&!"".equals(kpiYear)){
year = Integer.parseInt(kpiYear);
month = DateUtil.getMonth(dateNow);
//初始化当前年的12个月份
int sMonth = 12;
for(int i =0;i < 12;i++){
Integer[] newObj = new Integer[2];
newObj[0] = year; //年
newObj[1] = sMonth; //月
monthList.add(newObj);
sMonth--;
}
}else{
year = DateUtil.getYear(dateNow);
month = DateUtil.getMonth(dateNow);
//初始化最新的12个月份
int sYear = year;
int sMonth = month;
for(int i =0;i < 12;i++){
Integer[] newObj = new Integer[2];
if(sMonth == 0){
sYear = sYear -1;
sMonth = 12;
}
newObj[0] = sYear; //年
newObj[1] = sMonth; //月
fyear=String.valueOf(sYear);
if(sMonth<10){
fmonth="0"+sMonth;
}else{
fmonth=String.valueOf(sMonth);
}
monthList.add(newObj);
sMonth--;
}
}
//初始化数据水平总辐射量 固定式斜面总辐射量 极轴斜面总辐射量 实际发电量
String sql = "";
if(kpiYear!=null&&!"".equals(kpiYear)){
sql = "SELECT substr(t.PROMONTH,0,4) pyear,substr(t.PROMONTH,5) pm,sum(t.LevTotRadia),sum(t.IncTotRadia),sum(t.PAIncTotRadia),sum(t.GenerCapac) FROM MNT_TOECINDICA_MONTH t WHERE substr(t.PROMONTH,0,4)='"+year+"' GROUP BY substr(t.PROMONTH,0,4),substr(t.PROMONTH,5) ORDER BY substr(t.PROMONTH,5) DESC";
}else{
sql = "SELECT substr(t.PROMONTH,0,4) pyear,substr(t.PROMONTH,5) pm,sum(t.LevTotRadia),sum(t.IncTotRadia),sum(t.PAIncTotRadia),sum(t.GenerCapac) FROM MNT_TOECINDICA_MONTH t WHERE ((substr(t.PROMONTH,0,4)='"+fyear+"' AND substr(t.PROMONTH,5) >='"+fmonth+"') OR (substr(t.PROMONTH,0,4) ='"+year+"' AND substr(t.PROMONTH,5) <='"+month+"')) GROUP BY substr(t.PROMONTH,0,4),substr(t.PROMONTH,5) " ;
}
List rowList = daoSrv.findBySql(sql);
for(Integer[] mlist: monthList){
int y = mlist[0];
int m = mlist[1];
String key = y + "-" + (m < 10 ? "0" + m : "" + m);
double[] energy= new double[4];
for(Object[] row: rowList){
int staYear = Integer.valueOf(row[0].toString());
int StatMonth = Integer.valueOf(row[1].toString());
if(m == StatMonth && y == staYear){
energy[0] = Double.valueOf(row[2].toString());//水平总辐射量
energy[1] = Double.valueOf(row[3].toString());//固定式斜面总辐射量
energy[2] = Double.valueOf(row[4].toString());//极轴斜面总辐射量
energy[3] = Double.valueOf(row[5].toString());//实际发电量
}
//等于当前月
if(m == month && y == year){
String mo = m+"";
String ye = y+"";
if(Integer.valueOf(m)<10){
mo="0"+mo;
}
String sql2 = "select sum(t.LevTotRadia),sum(t.IncTotRadia),sum(t.PAIncTotRadia),sum(t.GenerCapac) from mnt_toecindica_day t where substr(t.prodate,0,6)='"+ye+mo+"'";
List genlist = daoSrv.findBySql(sql2);
if(genlist != null && genlist.size()>0){
energy[0] = genlist.get(0)[0] == null ? 0.0 : Double.valueOf(genlist.get(0)[0]+"");
energy[1] = genlist.get(0)[1] == null ? 0.0 : Double.valueOf(genlist.get(0)[1]+"");
energy[2] = genlist.get(0)[2] == null ? 0.0 : Double.valueOf(genlist.get(0)[2]+"");
energy[3] = genlist.get(0)[3] == null ? 0.0 : Double.valueOf(genlist.get(0)[3]+"");
}
}
}
cur.put(key, energy);
}
return cur;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public CategoryDataset getDataset() {
return dataset;
}
public void setDataset(CategoryDataset dataset) {
this.dataset = dataset;
}
public IBaseDao getDaoSrv() {
return daoSrv;
}
public void setDaoSrv(IBaseDao daoSrv) {
this.daoSrv = daoSrv;
}
public String getKpiYear() {
return kpiYear;
}
public void setKpiYear(String kpiYear) {
this.kpiYear = kpiYear;
}
public CategoryDataset getDatasetTwo() {
return datasetTwo;
}
public void setDatasetTwo(CategoryDataset datasetTwo) {
this.datasetTwo = datasetTwo;
}
}