GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

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

java
Tags: #<Tag:0x00007fbf1ccf5fc0>

#1

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

    }

}


#2

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.


#3

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


#4

Blza, de nada!