jfreechart xylinechart排序时间未更新

时间:2014-01-14 00:23:06

标签: java swing plot jfreechart

我正在Java Swing中进行简单的排序基准测试,我希望它能够显示随时间变化的图形。但是算法运行时图表不会更新。我真的很困惑。有人可以解释一下我做错了吗?

当GUI运行时,数组充满了随机数据

int A[]=null;int [] copyOfA=null; 

图表

   final XYSeriesCollection dataset = new XYSeriesCollection();
   private ChartPanel createDemoPanel() {  
       JFreeChart jfreechart = ChartFactory.createXYLineChart(title, "array", "time",dataset ,
            PlotOrientation.VERTICAL, true, true, false);
    jfreechart.setBackgroundPaint(Color.white);
    XYPlot plot = (XYPlot) jfreechart.getPlot();
    plot.getDomainAxis().setRange(0, 1000); //array
    plot.getRangeAxis().setRange(-1,1);//time

    //plot.getDomainAxis().setFixedAutoRange(20);
    //plot.getRangeAxis().setFixedAutoRange(100);
    // render shapes and lines
    XYLineAndShapeRenderer renderer =
        new XYLineAndShapeRenderer(true, true);
    plot.setRenderer(renderer);
    renderer.setBaseShapesVisible(true);
    renderer.setBaseShapesFilled(true);

    return new ChartPanel(jfreechart);
}

在ActionPerformed中

   private void insSortActionPerformed(java.awt.event.ActionEvent evt) {       
   XYSeries series = new XYSeries("ins sort");

    if( insSort.isEnabled()) {

   long startTime = System.currentTimeMillis();
   insSort(A);
   long endTime = System.currentTimeMillis();
   totalRuntime += (endTime - startTime);
                             }

    series.add(totalRuntime,A.length);
    dataset.addSeries(series);                                         
     }

1 个答案:

答案 0 :(得分:0)

在此行,Y轴范围设置为(-1,1)间隔:

plot.getDomainAxis().setRange(0, 1000); //array
plot.getRangeAxis().setRange(-1,1);//time

Y轴的目的是取totalRuntime的值,这是以毫秒为单位的时差:

if( insSort.isEnabled()) {
   long startTime = System.currentTimeMillis();
   insSort(A);
   long endTime = System.currentTimeMillis();
   totalRuntime += (endTime - startTime); // this is certainly > 1
}
series.add(totalRuntime,A.length);
dataset.addSeries(series); 

这个值肯定是> 1(除非你拥有最强大的计算机:)。因此,您可以查看获得totalRuntime的值,并相应地调整Y轴范围。

您也可以查看:

  • 域轴范围:如果数组的元素数超过1000,则您也不会看到图形。
  • insSort.isEnabled()实际上是true吗?如果不是这样,那么您将向dataset添加垃圾。

附录

  

我想绘制排序时间与元素数量的关系

您可以查看下面的示例。由于我没有sort方法实现,因此该示例使用Swing timer模拟时间。关键是正确地将值添加到系列中并设置正确的范围。

注意:随机生成的时间随后显示的信息是垃圾。该示例尝试说明您应该遵循的过程以使图形工作。要特别注意fillChart()方法:它可以解决问题。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class Demo {

    private final XYSeries _timeSeries = new XYSeries("Time Series");
    boolean _shouldPaint;

    private void createAndShowGUI() {

        JToggleButton fillChart = new JToggleButton("Fill chart") ;
        fillChart.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JToggleButton toggleButton = (JToggleButton)e.getSource();
                if(toggleButton.isSelected()) {
                    _timeSeries.clear();
                    _shouldPaint = true;
                    fillChart();
                } else {
                    _shouldPaint = false;
                }
            }
        });

        JPanel content = new JPanel(new BorderLayout());
        content.add(getFreeChartPanel(), BorderLayout.CENTER);
        content.add(fillChart, BorderLayout.SOUTH);

        JFrame frame = new JFrame("Demo");      
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(content);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private JPanel getFreeChartPanel() {
        String title = "Time series example";

        XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(_timeSeries); // series is added only once!

        JFreeChart chart = ChartFactory.createXYLineChart(title, "Array elements", "Time (in millis)", dataset, 
                                                         PlotOrientation.VERTICAL, true, true, false);       
        XYPlot plot = chart.getXYPlot();
        plot.setRenderer(new XYLineAndShapeRenderer(true, true));
        plot.setDomainCrosshairVisible(true);
        plot.setRangeCrosshairVisible(true);
        plot.getDomainAxis().setRange(0, 1000); // Number of elements - top visible: 1000
        plot.getRangeAxis().setRange(0, 4000); // Time employed to do the sort - top visible: 4 seconds (4k millis)        

        return new ChartPanel(chart);
    }

    /**
     * You should do your own implementation of this method.
     */
    private void fillChart() {
        Timer timer = new Timer(500, new ActionListener() {

            long lastTimeMillis = System.currentTimeMillis();
            int domainAxis = 0;

            @Override
            public void actionPerformed(ActionEvent e) {
                if(_shouldPaint) {
                    long currentTimeMillis = System.currentTimeMillis();
                    long rangeAxisValue = (long)((currentTimeMillis - lastTimeMillis) * Math.random());
                    int domainAxisValue = domainAxis + 100;

                    _timeSeries.add(domainAxisValue, rangeAxisValue);
                    // Note this is the unique line that has an effect on the graphic

                    lastTimeMillis = currentTimeMillis;
                    domainAxis = domainAxisValue;

                } else {
                    Timer timer = (Timer)e.getSource();
                    timer.stop();
                }
            }
        });

        timer.setDelay(1500);
        timer.start();
    }

    public static void main(String[] args) {   
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Demo().createAndShowGUI();
            }
        });
    }    
}

图片

enter image description here