[RESOLVIDO] Atualização Dinâmica de Gráfico JFreeChart

3 respostas
java
K

Pessoal, estou precisando atualizar dinamicamente um gráfico a cada iteração de um laço, porém o gráfico só atualiza ao final do laço.

Segue o exemplo do código.

import org.jfree.chart.ChartPanel;

import org.jfree.chart.JFreeChart;

import org.jfree.chart.axis.NumberAxis;

import org.jfree.chart.axis.ValueAxis;

import org.jfree.chart.plot.XYPlot;

import org.jfree.chart.renderer.xy.StandardXYItemRenderer;

import org.jfree.chart.renderer.xy.XYItemRenderer;

import org.jfree.data.xy.XYSeries;

import org.jfree.data.xy.XYSeriesCollection;
private JFreeChart panePop;
private XYSeriesCollection curvaGrafico;
private XYPlot plot;
private XYItemRenderer renderer = new StandardXYItemRenderer();

private ValueAxis domainAxis = new NumberAxis("Gerações");
private ValueAxis rangeAxis = new NumberAxis("Individuos");


public NewJFrame() {
    initComponents();

    curvaGrafico = new XYSeriesCollection();

    plot = new XYPlot(curvaGrafico, domainAxis, rangeAxis, renderer);

    panePop = new JFreeChart("Evolução", JFreeChart.DEFAULT_TITLE_FONT, plot, true);

    jpanel.add(new ChartPanel(panePop));
    jpanel.setPreferredSize(new java.awt.Dimension(380, 316));

}


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:

    XYSeries series2 = new XYSeries("função");
    curvaGrafico.addSeries(series2);

    double a = 0;
    for (int i = 0; i <= 100; i++) {

        a = Math.sin(i);
        series2.add(i, a);

        plot.setDataset(curvaGrafico);
        plot.setRenderer(renderer);

    }

}

3 Respostas

J

Veja se isso resolve seu problema.

Crie uma Thread e jogue o seu código de laço para dentro dela, exemplo:

class AtualizarGrafico extends Thread {

        public AtualizarGrafico() {
             start();
        }

        public void run() {

            XYSeries series2 = new XYSeries("função");
            curvaGrafico.addSeries(series2);

            double a = 0;
            for (int i = 0; i <= 100; i++) {

                a = Math.sin(i);
                series2.add(i, a);

                plot.setDataset(curvaGrafico);
                plot.setRenderer(renderer);

            }

        }

    }

Depois chame a Thread no evento do seu JButton:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        new AtualizarGrafico();
    }

Espero ter ajudado.

K

Ficou ótimo! Obrigado!
Só utilizei um sleep() dentro da thread, pois a execução havia ficado rápida de mais.

J

Blza, de nada!

Criado 6 de dezembro de 2017
Ultima resposta 7 de dez. de 2017
Respostas 3
Participantes 2