package com.gamemag.web.player;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
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.ValueAxis;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.StackedBarRenderer;
import org.jfree.chart.renderer.category.StandardBarPainter;
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.ui.RectangleEdge;
import org.springside.modules.orm.Page;
import com.gamemag.vo.IngotUseDirectionVo;
public class IngotUseBarChart {
/**
*
* @param page
* @param ingotList
* @param ingotVo
* @return
*/
private static CategoryDataset createDataset(Page<IngotUseDirectionVo> page,
List<IngotUseDirectionVo> ingotList, List<IngotUseDirectionVo> ingotVo) {
DefaultCategoryDataset defaultcategorydateaset = new DefaultCategoryDataset();
int index = 0;
if(page.getResult().size() > 14){
index = page.getResult().size() - 14;
}
for (int i = index ; i < page.getResult().size(); i++) {
String time = page.getResult().get(i).getDateTime().toString().substring(0, 10);
for (int j = 0; j < ingotVo.size(); j++) {
String ct_name = ingotVo.get(j).getCt_name();
for (int k = 0; k < ingotList.size(); k++) {
String time2 = ingotList.get(k).getDateTime().toString().substring(0, 10);
if(ingotVo.get(j).getCt_id().equals(ingotList.get(k).getCt_id()) && time.equals(time2)){
int sum = ingotList.get(k).getIngot();
defaultcategorydateaset.addValue(sum, ct_name, time);
}
}
}
}
return defaultcategorydateaset;
}
// 创建JFreeChar对象
private static JFreeChart createChart(CategoryDataset categoydataset) {
JFreeChart jfreechart = ChartFactory.createStackedBarChart("《武将杀》近14天元宝消耗方向", // 图表标题
null,// x轴的显示标签
null, // y轴的显示标签
categoydataset,// 数据集
PlotOrientation.VERTICAL,// 图表方向:水平垂直
true, // 是否生成图例
true,// 是否生成工具
false// 是否生成URL链接
);
// 解决标题乱码
CategoryPlot categoryplot = jfreechart.getCategoryPlot();
CategoryAxis domainAxis = categoryplot.getDomainAxis();// x轴
ValueAxis numberaxis = categoryplot.getRangeAxis(); // y轴
TextTitle t = jfreechart.getTitle();
t.setFont(new Font("宋体", Font.BOLD, 22));// 标题文字
domainAxis.setLabelFont(new Font("宋体", Font.BOLD, 20));// x轴标题文字
domainAxis.setTickLabelFont(new Font("黑体", Font.BOLD, 10));// x轴坐标上文字
domainAxis.setAxisLineStroke(new BasicStroke(1.6f)); // 设置轴线粗细
numberaxis.setLabelFont(new Font("宋体", Font.BOLD, 20));// y轴标题文字
numberaxis.setTickLabelFont(new Font("黑体", Font.BOLD, 10));// y轴坐标上文字
numberaxis.setAxisLineStroke(new BasicStroke(1.6f)); // 设置轴线粗细
numberaxis.setUpperMargin(0.1);// 设置最高的一个柱与图片顶端的距离(最高柱的10%)
jfreechart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 12));// 图例文字
jfreechart.getLegend().setPosition(RectangleEdge.RIGHT); // 图例居右
jfreechart.getLegend().setBackgroundPaint(Color.gray);// 图例背景色
jfreechart.setBorderStroke(new BasicStroke(1));// 设置边框宽度
jfreechart.setBackgroundPaint(Color.white); // 设置背景颜色
//jfreechart.setBackgroundPaint(new Color(253 , 231, 243));
StackedBarRenderer renderer = new StackedBarRenderer();
// renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
// renderer.setBaseItemLabelsVisible(true);//显示每个柱的数值
// 让柱子显示为一个平面图
renderer.setBarPainter(new StandardBarPainter());
renderer.setItemMargin(-0.01);
renderer.setShadowVisible(false);// 取消阴影
renderer.setMaximumBarWidth(0.05);// 设置柱子宽度
//renderer.setSeriesPaint(0, new Color(51, 102, 153));// 设置柱子颜色
categoryplot.setRenderer(renderer);
categoryplot.setBackgroundPaint(Color.white);
categoryplot.setDomainGridlinePaint(Color.white);//纵坐标虚线颜色
categoryplot.setDomainGridlinesVisible(true);
categoryplot.setRangeGridlinePaint(Color.white); //横坐标虚线颜色
categoryplot.setNoDataMessage("No data available");
categoryplot.setBackgroundPaint(Color.lightGray);
// categoryplot.setDomainGridlinePaint(Color.black); //设置纵坐标网格线(平分柱子)
// categoryplot.setRangeGridlinePaint(Color.blue);//设置纵坐标网格线
CategoryAxis categoryaxis = categoryplot.getDomainAxis(); // 横轴上的 Lable
categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);// 45度倾斜
return jfreechart;
}
public static String generateBarChart(HttpSession session, PrintWriter out,
Page<IngotUseDirectionVo> page,
List<IngotUseDirectionVo> ingotList,
List<IngotUseDirectionVo> ingotVo) throws IOException {
String filename = null;
CategoryDataset categoryDateset = createDataset(page, ingotList,
ingotVo);
JFreeChart chart = createChart(categoryDateset);
/**
* File directory = new File(".");
* System.out.println(directory.getCanonicalPath
* ()+"=========="+img_path);
*
* FileOutputStream fos_jpg = null; try { fos_jpg = new
* FileOutputStream("fruit.jpg");
* ChartUtilities.writeChartAsJPEG(fos_jpg, 1.0f, chart, 400,300,null);
* } finally { try { fos_jpg.close(); } catch (Exception e) {} }
**/
ChartRenderingInfo info = new ChartRenderingInfo(
new StandardEntityCollection());
try {
filename = ServletUtilities.saveChartAsPNG(chart, 1100, 450, info,
session);
ChartUtilities.writeImageMap(out, filename, info, false);
} catch (IOException e) {
e.printStackTrace();
}
out.flush();
return filename;
}
}