我正在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);
}
答案 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
轴范围。
您也可以查看:
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();
}
});
}
}