JFreeChart开发:利用JFreeChart开发实时曲线

package com.hitangjun.jfreechart.demo;

/**
 * =============================================================
 * JFreeChart开发:利用JFreeChart开发实时曲线
 * =============================================================
 */
// 导入java2d包
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
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.ValueAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.time.Millisecond;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.RefineryUtilities;

public class TimeSeriesDemo1 extends JFrame implements Runnable, ActionListener {
 // 时序图数据集
// private TimeSeries timeseries;
 private TimeSeries timeseries;
  XYSeries s3 = new XYSeries("次序值");

 // Value坐标轴初始值
 private double lastValue;

 static Class class$org$jfree$data$time$Millisecond;

 static Thread thread1;
 
 private javax.swing.JPanel jPanel1;
 int step = 10;

 public static void main(String[] args) {
  TimeSeriesDemo1 TimeSeriesDemo1 = new TimeSeriesDemo1();
  TimeSeriesDemo1.pack();
  RefineryUtilities.centerFrameOnScreen(TimeSeriesDemo1);
  TimeSeriesDemo1.setVisible(true);
  startThread();
 }

 public void run() {
  while (true) {
   try {
//    // 根据实际需要在此处加入需要执行的代码
    double d = 0.9D + 0.2D * Math.random();
//    lastValue = lastValue * d;
//    Millisecond millisecond = new Millisecond();
//    System.out.println("Now=" + millisecond.toString());
//    timeseries.add(millisecond, lastValue);
//    Thread.sleep(300);
    // 根据实际需要在此处加入需要执行的代码
//    double d = 0.9D + 0.2D * Math.random();
    lastValue = lastValue * d;
    System.out.println("step = "+step+",lastvalue = "+lastValue);
    s3.add(step, lastValue);
    step+=5;
    Thread.sleep(1000);
   } catch (InterruptedException e) {
   }
  }
 }

 private void initComponents(Component comp) {

        jPanel1 = new javax.swing.JPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("窗口demo");
        setLocationByPlatform(true);
        setResizable(false);

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("panel标题"));
        jPanel1.setToolTipText("串口设置");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 350, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 180, Short.MAX_VALUE)
        );

//        jPanel1.add( comp );
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(19, 19, 19)
                .addComponent(comp, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap(472, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(19, 19, 19)
                .addComponent(comp, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap(117, Short.MAX_VALUE))
        );

        jPanel1.getAccessibleContext().setAccessibleName("饭店");
        pack();
    }
 public static void startThread() {
  thread1.start();
 }

 public void actionPerformed(ActionEvent e) {
  if (e.getActionCommand().equals("EXIT")) {
   thread1.interrupt();
   System.exit(0);
  }
 }

 public TimeSeriesDemo1() {
     
  // super(new BorderLayout());
  thread1 = new Thread(this);
  lastValue = 100D;
  // 创建时序图对象
  timeseries = new TimeSeries(
    "Random Data",
    TimeSeriesDemo1.class$org$jfree$data$time$Millisecond != null ? TimeSeriesDemo1.class$org$jfree$data$time$Millisecond
      : (TimeSeriesDemo1.class$org$jfree$data$time$Millisecond = TimeSeriesDemo1
        .getClass("org.jfree.data.time.Millisecond")));
  TimeSeriesCollection timeseriescollection = new TimeSeriesCollection(
    timeseries);
  
  XYSeriesCollection dataset = new XYSeriesCollection(s3);
        dataset.addSeries( s3 );
  // 创建图表面板
  ChartPanel chartpanel = new ChartPanel(
    createChart(dataset));
  chartpanel.setPreferredSize(new Dimension(500, 270));

//  JPanel jpanel = new JPanel();
//  jpanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));// 边距为4
//  JButton jbutton = new JButton("退出");
//  jbutton.setActionCommand("EXIT");
//  jbutton.addActionListener(this);
//  jpanel.add(jbutton);
//  getContentPane().add(chartpanel,"South");
//  getContentPane().add(jpanel, "South");
  initComponents(chartpanel);
 }

 private JFreeChart createChart(XYDataset xydataset) {
  JFreeChart jfreechart = ChartFactory.createXYLineChart("时序图例子",
    "时间", "温度值", xydataset, PlotOrientation.VERTICAL, true, true, false);
  XYPlot xyplot = jfreechart.getXYPlot();
  // 横纵坐标设定
  
  ValueAxis valueaxis = xyplot.getDomainAxis();
  valueaxis.setRange( 1, 300D );
  valueaxis.setAutoRange(true);
  valueaxis.setFixedAutoRange(300D);

  valueaxis = xyplot.getRangeAxis();
  valueaxis.setRange(0.0D, 200D);
  configFont(jfreechart);
  return jfreechart;
 }

 static Class getClass(String s) {
  Class cls = null;
  try {
   cls = Class.forName(s);
  } catch (ClassNotFoundException cnfe) {
   throw new NoClassDefFoundError(cnfe.getMessage());
  }
  return cls;
 }
 
 /**
     * 配置字体 
     * @param chart JFreeChart 对象
     */
    private void configFont(JFreeChart chart){
     // 配置字体
     Font xfont = new Font("宋体",Font.PLAIN,12) ;// X轴
     Font yfont = new Font("宋体",Font.PLAIN,12) ;// Y轴
     Font kfont = new Font("宋体",Font.PLAIN,12) ;// 底部
     Font titleFont = new Font("隶书", Font.BOLD , 25) ; // 图片标题
     XYPlot plot = chart.getXYPlot();// 重生之大文豪www.dwhao.com图形的绘制结构对象
     
     // 图片标题
     chart.setTitle(new TextTitle(chart.getTitle().getText(),titleFont));
     
     // 底部
     chart.getLegend().setItemFont(kfont);
     
     // X 轴
     ValueAxis domainAxis = plot.getDomainAxis();
        domainAxis.setLabelFont(xfont);// 轴标题
        domainAxis.setTickLabelFont(xfont);// 轴数值  
        domainAxis.setTickLabelPaint(Color.BLUE) ; // 字体颜色
//        domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 横轴上的label斜显示 
        
     // Y 轴
     ValueAxis rangeAxis = plot.getRangeAxis();   
        rangeAxis.setLabelFont(yfont); 
        rangeAxis.setLabelPaint(Color.BLUE) ; // 字体颜色
        rangeAxis.setTickLabelFont(yfont);  
        
    }

}

原文地址:https://www.cnblogs.com/haichun/p/3496335.html