时间序列JFreeChart重新绘制时间轴

时间:2012-07-11 09:23:16

标签: java swing jfreechart

我使用JFreeChart API创建了动态时间序列图表。它工作正常。我必须添加一个组合框,其中时间值将在那里,如5秒,15秒,30秒。当用户从中选择时,时间轴必须以给定的间隔重新绘制,并且计时器必须将进程延迟5,15,30秒(更新图表)。我在上一篇文章this

中这样做了

有一些扩展名,例如添加组合框

但它不适合我,任何帮助将不胜感激。感谢

编辑1 删除了不需要的代码,剩下的代码是

    final DynamicTimeSeriesCollection dataset =
    new DynamicTimeSeriesCollection(1, 60, new Second());

dataset.setTimeBase(new Second( 0,seriesvalue*2, 5, 11, 7, 2012));

dataset.addSeries(new float[]{0}, 0, "Currency Rate");
JFreeChart chart = createChart(dataset);
chartPanel = new ChartPanel(chart);


final JComboBox combo = new JComboBox();
combo.addItem("5");
combo.addItem("15");
combo.addItem("30");

combo.addActionListener(new ActionListener(){

  public void actionPerformed(ActionEvent e){

    if("5".equals(combo.getSelectedItem())){
      seriesvalue=5;
      timer.setDelay(seriesvalue*1000);
    }else  if("15".equals(combo.getSelectedItem())){

      seriesvalue=15;
      timer.setDelay(seriesvalue*1024);
      unit=new DateTickUnit(DateTickUnitType.MINUTE,seriesvalue);
      chartPanel.repaint();
    }
  }
});
    add(chartPanel,BorderLayout.CENTER);
    add(combo,BorderLayout.SOUTH);
timer = new Timer(999*seriesvalue, new ActionListener() {

        public void actionPerformed(ActionEvent e) {
          for(int i=0;i<seriesvalue;i++){

            newData[0] = randy.getRandomvalue();
            dataset.advanceTime();
            dataset.appendData(newData);

          }             

        }
    });

创建数据集代码

  private JFreeChart createChart(final XYDataset dataset) {
   JFreeChart result= ChartFactory.createTimeSeriesChart(
      "Dyanmic chart", "hh:mm:ss", "Currency", dataset, true, true, false);
  final XYPlot plot = result.getXYPlot();

  dateAxis= (DateAxis)plot.getDomainAxis();
  unit = new DateTickUnit(DateTickUnitType.MINUTE,seriesvalue/2);
  return result;
}

主要方法

public static void main(final String[] args) {
  EventQueue.invokeLater(new Runnable() {
      public void run() {
          DynaChart chart = new DynaChart();
          chart.pack();
          RefineryUtilities.centerFrameOnScreen(chart);
          chart.setVisible(true);
          chart.start();
      }
  });
 }

1 个答案:

答案 0 :(得分:1)

我不确定我是否理解了您发布的片段的要求。如果您只需要以几种不同的频率对数据源进行采样,则可以设置javax.swing.Timer延迟,如example所示。

附录:我要重新绘制DateAxis

API注意到setTimeBase()“如果时间数组已经填充,将静默返回。”我怀疑您需要在组合的动作侦听器中重新创建DynamicTimeSeriesCollection。您可能还想更改DateAxis的刻度单位和格式,如上所述here