使用JFreeChart更改系列时出现随机错误
我正在做一个显示背景计算结果的GUI。 但在此之前,我想testing更改数据集。 这是我的代码:
DefaultXYDataset dataset = new DefaultXYDataset(); @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < periods; i++) { series[0][i] = (double) i; series[1][i] = 0; } dataset.addSeries("Series0", series); for (int it = 0; it < 10; it++) { series[1][random.nextInt(periods)] = random.nextInt(100) / 2; double[][] d = new double[2][periods]; for (int i = 0; i < periods; i++) { d[0][i] = series[0][i]; d[1][i] = series[1][i]; } dataset.removeSeries("Series0"); dataset.addSeries("Series0", series); // try { // Thread.sleep(100); // } catch (java.lang.InterruptedException ex) { // } }
正如你所看到的,我想改变图上的点(每次它完成一些复杂的计算) – 这个改变是在另一个类的我调用的线程。 我的问题是,这个整体概念不起作用。 它抛出了“系列索引越界” – IllegalArgumentException,“索引超出界限” – 一些库内数组列表等。我没有使用DynamicTimeSeriesCollection,因为我需要X轴是我的内部迭代的数量而不是时间期间,并且在“一些计算”不是每隔一段时间完成时更新。 你能告诉我我做错了什么吗? 还是有更好的方式来更新/刷新图表?
您的代码段被错误地同步; 您应该从SwingWorker
的process()
方法更新dataset
,如下所示。 如ChartFactory.createXYLineChart()
所示,使用NumberAxis
ChartFactory.createXYLineChart()
。
附录:引用示例中的这种变化将工人的进度绘制在折线图上。 请注意, createXYLineChart()
对域和范围均使用NumberAxis
。
private XYSeriesCollection collection = new XYSeriesCollection(); private XYSeries series = new XYSeries("Result"); ... collection.addSeries(series); JFreeChart chart = ChartFactory.createXYLineChart( "Newton's Method", "X", "Y", collection, PlotOrientation.VERTICAL, false, true, false); XYPlot plot = (XYPlot) chart.getPlot(); plot.getRangeAxis().setRange(1.4, 1.51); plot.getDomainAxis().setStandardTickUnits( NumberAxis.createIntegerTickUnits()); XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer(); renderer.setSeriesShapesVisible(0, true); this.add(new ChartPanel(chart), BorderLayout.CENTER); ... private int n; @Override protected void process(List<Double> chunks) { for (double d : chunks) { label.setText(df.format(d)); series.add(++n, d); } }