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!