swing中使用jfreechart创建柱形图

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;
 }
}

 

效果图如下:



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值