如何使用JFreeChart来构建折线图_动态刷新

监控软件需要比较实时地显示出系统的一些统计信息,所以要求图形可以动态刷新

package com.maty;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Font;
import java.text.SimpleDateFormat;

import javax.swing.JFrame;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.AxisSpace;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.DateTickUnitType;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.StandardXYItemLabelGenerator;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.Millisecond;
import org.jfree.data.time.Second;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;

/**
 * @author maty
 * @version 创建时间:2018年5月3日 上午10:52:00 类说明 用来练习将MyTimeSeries类改变成多线程,用来实现折线图的动态刷新
 */
public class MyTimeSeries1 extends ChartPanel implements Runnable
{
	public static TimeSeries timeseries = new TimeSeries("CPU使用率", Second.class);;
	
	private static final long serialVersionUID = 1L;
	//构造函数
	public MyTimeSeries1(JFreeChart chart)  
	{
		super(chart);
	}
	
	//定义随机数据,之后用户timeseries类
	public static double RandomNumber()
	{
		double temp;
		temp = Math.random()*100;
		return temp;
	}
	

	@SuppressWarnings("deprecation")
	public static JFreeChart getJFreeChart()
	{
		// 首先要解决中文乱码问题
				// 创建主题样式
				StandardChartTheme standardChartTheme = new StandardChartTheme("CN");
				// 设置标题字体
				standardChartTheme.setExtraLargeFont(new Font("隶书", Font.BOLD, 20));
				// 设置图例的字体
				standardChartTheme.setRegularFont(new Font("宋书", Font.PLAIN, 15));
				// 设置轴向的字体
				standardChartTheme.setLargeFont(new Font("宋书", Font.PLAIN, 15));
				// 应用主题样式
				ChartFactory.setChartTheme(standardChartTheme);

				// 第一步:创建timeseries实例,并将有效数据加入到该timeseries中
				@SuppressWarnings("deprecation")
				//timeseries = new TimeSeries("CPU使用率", Second.class);
				

				// 第二步:将timeseries加入到数据集中
				TimeSeriesCollection dataset = new TimeSeriesCollection(timeseries);

				// 第三步:创建时序图相关的JFreeChart对象
				JFreeChart seriesChart = ChartFactory.createTimeSeriesChart("CPU使用率", "时间(间隔为5S)", "使用率(%)", dataset, true,
						true, true);

				// 第四步:对表的绘图区域进行设定
				XYPlot xyPlot = seriesChart.getXYPlot(); // 时序图的plot为XYPlot
				
				//对DomainAxis()进行设定
				ValueAxis valueAxis = xyPlot.getDomainAxis();
				valueAxis.setAutoRange(true);
				valueAxis.setFixedAutoRange(10000D);  //设置整个X轴的总的长度(*****)======>这个最重要了
				
				// 先对X轴设定
				DateAxis axis = (DateAxis) xyPlot.getDomainAxis(); // 将ValueAxis强转成DateAxis
				axis.setDateFormatOverride(new SimpleDateFormat("HH点mm分ss秒"));
				axis.setAxisLineVisible(true); // 设定x轴可见
				axis.setAutoRange(true); // 设定x轴的刻度自动调整
				axis.setAutoTickUnitSelection(true); // x轴的刻度可见
				axis.setVerticalTickLabels(true); // x轴的标签垂直分布
				axis.setTickUnit(new DateTickUnit(DateTickUnitType.MILLISECOND,1000)); // 这里设置X轴的刻度间隔

				// 在对Y轴设定
				ValueAxis axis2 = xyPlot.getRangeAxis();
				axis2.setAutoRange(true); // Y轴可以随着图像的伸缩做数值的变化
				axis2.setLowerBound(0); // 保证Y轴能够从0开始显示数据
				axis2.setUpperBound(100); // 设置Y轴显示的最大值
				axis2.setAutoRange(false);

				// 对折线本身对象进行编辑,折线对象是XYItemRenderer,XYItemRenderer是一个interface,需要将XYItemRenderer转换为实现了它的XYLineAndShapeRenderer
				XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) xyPlot.getRenderer();
				renderer.setBaseShapesVisible(true); // 使折线图上面带有图例
				renderer.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator()); // 是数字显示在折线上
				renderer.setBaseItemLabelsVisible(true); // 是数字显示在折线上
				renderer.setAutoPopulateSeriesFillPaint(true);
				renderer.setAutoPopulateSeriesOutlineStroke(true);		
		return seriesChart;
	}

	@Override
	public void run()
	{
		while(true)
		{			
			try
			{				
				
				//System.out.println(new Second()+"--->"+MyTimeSeries1.RandomNumber());
				timeseries.add(new Second(),MyTimeSeries1.RandomNumber());
				Thread.sleep(1000);
			
			} catch (InterruptedException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args)
	{
		MyTimeSeries1 MTS = new MyTimeSeries1(MyTimeSeries1.getJFreeChart());
		JFrame frame = new JFrame();
		frame.getContentPane().add(MTS);
		(new Thread(MTS)).start();
		frame.setVisible(true);
		frame.setSize(800, 400);
		frame.pack();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}

	
	
}

 

效果图




  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值