package com.xhm.test;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
/**
* swing中使用jfreechart构建柱形图
*
* @author xhmder
*
*/
public class BarChartTest extends JFrame
{
private static final long serialVersionUID = 1L;
public BarChartTest()
{
setTitle("个人收支情况");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
PanMain panMain = new PanMain(createDataSet());
add(panMain);
}
/**
* 构建图表显示数据
*
* @return
*/
private CategoryDataset createDataSet()
{
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.setValue(1000, "收入", "1月");
dataset.setValue(800, "支出", "1月");
dataset.setValue(1000, "收入", "2月");
dataset.setValue(200, "支出", "2月");
dataset.setValue(1000, "收入", "3月");
dataset.setValue(800, "支出", "3月");
dataset.setValue(1000, "收入", "4月");
dataset.setValue(200, "支出", "4月");
dataset.setValue(1000, "收入", "5月");
dataset.setValue(800, "支出", "5月");
dataset.setValue(1000, "收入", "6月");
dataset.setValue(200, "支出", "6月");
return dataset;
}
public static void main(String[] args)
{
BarChartTest frame = new BarChartTest();
frame.setSize(600, 300);
frame.setVisible(true);
}
}
/**
* 柱形图面板
*
* @author xhmder
*
*/
class PanMain extends JPanel
{
private static final long serialVersionUID = 1L;
public PanMain(CategoryDataset dataSet)
{
this.setLayout(new BorderLayout());// 边框布局,使生成的柱形图随面板大小变化
setBorder(BorderFactory.createTitledBorder("收支情况图"));
ChartPanel p = new ChartPanel(createdBarChart(dataSet));
add(p, BorderLayout.CENTER);
}
private JFreeChart createdBarChart(CategoryDataset dataSet)
{
JFreeChart jfreeChart = ChartFactory.createBarChart3D("个人收支情况图",// 图表标题
"月份",// 目录轴(一般为横轴)标题
"金额",// 数据轴(一般为纵轴)标题
dataSet, // 数据集
PlotOrientation.VERTICAL, // 图表方向
true,// 是否显示图例(对于简单的柱状图必须是false)
false,// 是否生成工具
false// 是否生成URL链接
);
// 设置柱形图标题及标题字体
jfreeChart.setTitle(new TextTitle("个人收支情况图", new Font("黑体", Font.PLAIN,
14)));
// 获得图表,以进行更多属性设置
CategoryPlot plot = (CategoryPlot) jfreeChart.getPlot();
// 获得目录轴
CategoryAxis cAxis = plot.getDomainAxis();
// 设置目录轴坐标上文字的字体
cAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 12));
// 设置目录轴轴的标题文字的字体
cAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
// 获得数据轴
ValueAxis vAxis = plot.getRangeAxis();
// 设置数据轴坐标上的文字的字体
vAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 12));
// 设置数据轴的标题文字的字体
vAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
// 设置图例中文字的字体,要求createBarChart3D中的是否图例必须为true
jfreeChart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));
// 渲染柱形图的样式
BarRenderer3D renderer = new BarRenderer3D();
renderer.setBaseOutlinePaint(Color.BLACK);
// 设置 3D效果围墙的颜色
renderer.setWallPaint(Color.gray);
// 设置柱的颜色
renderer.setSeriesPaint(0, Color.red);// 第一个柱形
renderer.setSeriesPaint(1, Color.blue);// 第二个柱形
// 设置柱的轮廓 颜色
renderer.setSeriesOutlinePaint(0, Color.blue);
renderer.setSeriesOutlinePaint(1, Color.red);
// 设置平行柱的之间距离
renderer.setItemMargin(0.1);
// 显示每个柱的数值,并修改该数值的字体属性
renderer
.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(true);
// 使图表使用渲染效果
plot.setRenderer(renderer);
// 设置柱的透明度
plot.setForegroundAlpha(0.6f);
return jfreeChart;
}
}
效果图如下: