Problemas com atualização grafico

1 resposta
E

Estou fazendo um sistema que atualiza um grafico a cada x segundos.
Estou usando o jfreechart para a criação do gráfico. O sitema funciona normalmente no inicio, mas com o passar do tempo, o sistema vai ficando lento e trava.
Eu acho que o meu programa não está removendo corretamente o gráfico anterior, está apenas colocando o gráfico por cima.

A linha 30 da primeira classe chama a função da classe graficos. Esta função retorna um JPanel com o grafico. Então eu removo o JPanel e insiro o novo objeto JPanel(novo grafico).

public Principal()
    {
        painelPrincipal = new JFrame("Grafico");
        cons = new GridBagConstraints();
        layout = new GridBagLayout();  
        tela = painelPrincipal.getContentPane();
        tela.setLayout(layout);
        painelPrincipal.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
    public void atualizaGraficos()
    {
        for(;;)
        {
            mostrarGrafico1();
            parar(5000);
            //mostrarGrafico2();
            //parar(20000);
            //mostrarGrafico3();
            //parar(20000);
        }  
    }

    public void mostrarGrafico1()
    {
        String[] nomes = { "Fatia1" , "Fatia2" , "Fatia3"};
        String[] valores ={"21.5", "12.8", "4.6"};
        //valores = buscaDadosGrafico1();
        JPanel painelGrafico = null;
        painelGrafico = Graficos.Pizza3DRotator ( nomes, valores, "Gráfico Geral" );
        pnGrafico.removeAll();
        pnGrafico.add (painelGrafico);
        tela.remove(pnGrafico);
        tela.add(pnGrafico, cons);
        painelPrincipal.pack();
        painelPrincipal.setVisible(true);
    }

e agora a classe Graficos, que usa o jfreechart

package javaapplication1;

// classes da API jfreechart
import java.awt.Font;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.Pie3DPlot;
import org.jfree.data.DefaultPieDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.jfree.util.Rotation;

public class Graficos 
{
    String tipo = "";
    public Graficos () {}

    /**
    * Retorna um painel com o gráfico 3D giratório adicionado
    *
    * @param nome Array com os nomes dos campos
    * @param valor Array com os valores dos campos
    * @param tituloGráfico Título do gráfico
    *
    * @return chartPanel Painel com o gráfico adicionado
    */

    public static javax.swing.JPanel Pizza3DRotator (String[] nome, String[] valor, String tituloGrafico ) 
    {
        return pizza3D ( nome, valor, tituloGrafico, 0.60f , "Dinamic" );
    }

    /**
    * Retorna um painel com o gráfico 3D giratório adicionado
    *
    * @param nome Array com os nomes dos campos
    * @param valor Array com os valores dos campos
    * @param tituloGráfico Título do gráfico
    * @param transparencia Determina o nível de transparência do gráfico
    *
    * @return chartPanel Painel com o gráfico adicionado
    */

    public static javax.swing.JPanel Pizza3DRotator (String[] nome, String[] valor, String tituloGrafico, float transparencia ) 
    {
        return pizza3D ( nome, valor, tituloGrafico, transparencia, "Dinamic" );
    }

    /**
    * Retorna um painel com o gráfico 3D estático
    * @param nome Array com os nomes dos campos
    * @param valor Array com os valores dos campos
    * @param tituloGráfico Título do gráfico
    * @return chartPanel Painel com o gráfico adicionado
    */

    public static javax.swing.JPanel Pizza3DStatic (String[] nome, String[] valor, String tituloGrafico ) 
    {
        return pizza3D ( nome, valor, tituloGrafico, 0.5f , "Static" );
    }

    /**
    * Retorna um painel com o gráfico 3D estático
    * @param nome Array com os nomes dos campos
    * @param valor Array com os valores dos campos
    * @param tituloGráfico Título do gráfico
    * @param transparencia Determina o nível de transparência do gráfico
    * @return chartPanel Painel com o gráfico adicionado
    */

    public static javax.swing.JPanel Pizza3DStatic (String[] nome, String[] valor, String tituloGrafico, float transparencia ) 
    {
        return pizza3D ( nome, valor, tituloGrafico, transparencia, "Static" );
    }

    /**
    * Método usado pelos outros métodos de Pizza desta classe
    * @param nome Array com os nomes dos campos
    * @param valor Array com os valores dos campos
    * @param tituloGráfico Título do gráfico
    * @param transparencia Determina o nível de transparência do gráfico
    * @param tipo Determina qual o tipo do gráfico. Ex: Dinamico ou Estatico
    * @return chartPanel Painel com o gráfico adicionado
    */

    private static javax.swing.JPanel pizza3D (String[] nome,String[] valor, String tituloGrafico, float transparencia, String tipo )
    {
        // cria um dataset...
        DefaultPieDataset data = null;
        JFreeChart chart = null;
        java.awt.Color cor = null;
        Pie3DPlot plot = null;
        ChartPanel chartPanel = null;
        Rotator rotator = null;
        System.gc();
        data = new DefaultPieDataset ();
        int nomeSize = nome.length;
        int valorSize = valor.length;
        // Neste método são adicionados os valores que irão aparecer no gráfico
        for ( int i = 0 ; i < nomeSize; i++)
        {
            data. setValue ( "" +nome[i], new Double (valor[i]) );
        }
        // cria o chart...
        chart = ChartFactory. createPieChart3D (tituloGrafico, //título
        data, // dados
        true , // inclue legenda
        true ,
        false
        );

        cor = new java.awt. Color ( 200 , 200 , 255 );
        chart.setBackgroundPaint (cor);
        plot = (Pie3DPlot) chart. getPlot ();
        if (tipo. equals ( "Static" ))
        {
            plot. setStartAngle ( 90 );
            plot. setDirection (Rotation.CLOCKWISE);
        } 
        else 
            if (tipo. equals ( "Dinamic" ))
            {
                plot. setStartAngle ( 270 );
                plot. setDirection (Rotation.ANTICLOCKWISE);
            }

        plot. setForegroundAlpha (transparencia);
        plot. setInteriorGap ( 0.33 );
        // adiciona o chart a um ChartPanel que é um painel
        chartPanel = new ChartPanel (chart);
        //chartPanel.setPreferredSize(new java.awt.Dimension(800, 600));

        //chartPanel.setFont(new Font("", Font.BOLD, 30));
        if (tipo. equals ( "Dinamic" ))
        {
            rotator = new Rotator (plot);
            rotator. start ();
        }
        

        return chartPanel;
    }

} //Fim classe Graficos.java

obrigado!

1 Resposta

D

Tenta usar o Garbage Collector no final do método mostrarGrafico1():

System.gc();

Diga se resolveu, por favor.

Criado 31 de maio de 2008
Ultima resposta 4 de jun. de 2008
Respostas 1
Participantes 2