thread progressbar example event ejemplo cancel java swing concurrency jfreechart

java - progressbar - Errores aleatorios al cambiar series usando JFreeChart



swingworker java ejemplo (1)

Estoy haciendo una GUI que muestra el resultado de los cálculos de fondo. Pero antes de eso, quería probar el cambio del conjunto de datos. Aquí está mi código:

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) { // } }

Como puede ver, quiero cambiar los puntos en el gráfico (cada vez que termina ''algunos cálculos complicados'') - este cambio está en el hilo invocado por mí en otra clase. Mi problema es que todo este concepto no funciona. Arroja ''Índice de serie fuera de límites'' -Excepción de campo ilegal, ''índice fuera de límites'' - de una lista de arrays interna de biblioteca, etc. No estoy utilizando DynamicTimeSeriesCollection porque necesito que el eje X sea el número de iteraciones internas, no el tiempo período, y también actualizar cuando ''algunos cálculos'' están terminados no cada cierto período de tiempo. ¿Puedes decirme qué estoy haciendo mal? ¿O hay una mejor manera de actualizar / actualizar el gráfico?


Su fragmento está incorrectamente sincronizado; debe actualizar su dataset de dataset del método process() de un SwingWorker , como se muestra aquí . En lugar de un DateAxis , use un NumberAxis , como se muestra en ChartFactory.createXYLineChart() .

Adición: Esta variación en el ejemplo citado traza el progreso del trabajador en un gráfico de líneas. Tenga en cuenta que createXYLineChart() usa NumberAxis para el dominio y el rango.

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); } }