JFreeChart....HELP!

Fala galera…

alguem aki jah usou o pacote JFreeChart p/ criar graficos??

preciso colocar meus graficos na aplicacao WEB, mas nao entendi mto bem como ele funciona…

em aplicacao desktop, nao tem segredo…eh bem simples fazer graficos, mas tentando rastrear o exemplo q vem com o pacote, nao acho os servlets q ele chama…

alguem poderia ajudar??

valew

Esse aqui é um código bem porco que eu usei um tempo atrás pra gerar gráfico por ele (o código está simplificado, mas na essência é isso mesmo):

public void processRequest(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException {

    // prepara as variaveis
    ServletOutputStream out1 = response.getOutputStream();
    ByteArrayOutputStream out2=new ByteArrayOutputStream();

    response.setHeader("Expires","-1");
    response.setContentType("image/jpeg");

    JChart myChart = SEU_MÉTODO_QUE_RETORNA_UM_JCHART;

    Frame frame = new Frame();
    frame.addNotify();
    Image image = frame.createImage(750,500);
    Graphics g = image.getGraphics();
    myChart.draw((Graphics2D) g, new Rectangle(750,500));

    JpegEncoder encoder = new JpegEncoder(image,100,out2);
    encoder.Compress();

    if (g!=null) g.dispose();
    if (frame != null) frame.removeNotify();
    response.setContentLength(out2.size());
    out1.write(out2.toByteArray());

    response.flushBuffer();
}

Esse método era chamado tanto no doGet quanto no doPost do servlet. Como você pode perceber, ele vai devolver um JPEG (usava uma outra classe para transformar), mas você pode alterar facilmente para qualquer outro formato.

valew pela dica, fenrir…

isso deve me ajudar aki…

falow

Uma maneira simples de exibir um gráfico na WEB, é utilizar o método estático ChartUtilities.saveChartAsJPEG, por exemplo, o código abaixo você executa uma classe Action (isso cria um gráfico tipo pizza 3D):

        DefaultPieDataset pieDataset = new DefaultPieDataset();
        pieDataset.setValue("Empregados - 300", new Integer(300));
        pieDataset.setValue("Desempregados - 200", new Integer(200));
        JFreeChart chart = ChartFactory.createPie3DChart("Apenas um teste",pieDataset, true,false,false);
        Pie3DPlot pieplot = (Pie3DPlot)chart.getPlot();
        pieplot.setPaint(0, Color.RED);
        pieplot.setPaint(1, Color.YELLOW);
        // grava o gráfico como JPEG
        ChartUtilities.saveChartAsJPEG(new File(caminho + "chart.jpg"), chart, 600, 400);   

Daí você chama uma página html com uma tag img, exemplo :

<img src="images/chart.jpg">
sacou ? chart.jpg é a imagem do gráfico gerado no código acima

Essa foi uma solução que nós pensamos, porém ela traz alguns inconvenientes:

  • se dois usuários pedem um gráfico com dados diferentes (por exemplo, com opções de filtragem diferentes), o gráfico não pode ser gravado com o mesmo nome, pois um deles pode ser apresentado de forma incorreta ou até corrompido;

  • se geramos os arquivos com nome diferente, o problema acima não ocorre, mas quem vai apagar o arquivo do servidor?

Existem formas de apagar o arquivo, concordo. Mas nenhuma que seja segura, dentro dos padrões MVC, e que não possa ser considerada uma “gambiarra” (como colocar um script que roda de tempos em tempos apagando os arquivos de determinado diretório).

Use o CeWolf, que tem tags por JSP e utiliza o JFreeChart.

[quote=fenrir]Essa foi uma solução que nós pensamos, porém ela traz alguns inconvenientes:

  • se dois usuários pedem um gráfico com dados diferentes (por exemplo, com opções de filtragem diferentes), o gráfico não pode ser gravado com o mesmo nome, pois um deles pode ser apresentado de forma incorreta ou até corrompido;

  • se geramos os arquivos com nome diferente, o problema acima não ocorre, mas quem vai apagar o arquivo do servidor?

Existem formas de apagar o arquivo, concordo. Mas nenhuma que seja segura, dentro dos padrões MVC, e que não possa ser considerada uma “gambiarra” (como colocar um script que roda de tempos em tempos apagando os arquivos de determinado diretório).[/quote]

Solução simples e Elegante. Parabens

Uma maneira melhor que criar o arquivo é gerar uma saida direto no output do servlet
usando o ChartUtilities.writeChartAsJPEG
ex:


response.setContentType("image/jpg");
OutputStream out = response.getOutputStream();
ChartUtilities.writeChartAsJPEG(out,chart,tamanho,altura);

no jsp o lugar que voce quer exibir a imagem deve ser:

CeWolf, fica mais elegante ainda e você não precisa reescrever nada.

Ola Pessoal !!

Estou tentando gerar um grafico com Struts2 usando o JFreeChart , mas quando chamo a action a imagem fica com um (X) no meio e nao mostra o grafico.
Eu tenho que liberar alguma coisa no web.xml ??

Obrigado pela ajuda .

Ola Pessoal !!!

Estou tentando gerar um grafico usando Struts2 e o Jfreechart.
Mas quando chamo a action usando uma tag html (<img …>) a imagem fica com um (X) e nao mostra o grafico.
Eu tenho que liberar alguma coisa no web.xml ???

Obrigado pela ajuda .

Evaristo.Rodrigues

Opa galera aproveitando o gancho não estou conseguindo executar o jfreechart com servlet

@WebServlet("/graficoJFreeChartServelt")
public class GraficoJFreeChartServelt extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			response.setContentType("image/jpeg");
			OutputStream out = response.getOutputStream();
			ChartUtilities.writeChartAsJPEG(out, criarGrafico(), 300, 300);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private JFreeChart criarGrafico() throws Exception {
		
		Double porcentagem = 1000D;
		DefaultValueDataset dataset1 = new DefaultValueDataset(porcentagem);
		DefaultValueDataset dataset2 = new DefaultValueDataset(500D);

		DialPlot dialplot = new DialPlot();
		dialplot.setView(0.0D, 0.0D, 1.0D, 1.0D);
		dialplot.setDataset(0, dataset1);
		dialplot.setDataset(1, dataset2);

		StandardDialFrame standarddialframe = new StandardDialFrame();
		standarddialframe.setBackgroundPaint(Color.lightGray);
		standarddialframe.setForegroundPaint(Color.GRAY);
		dialplot.setDialFrame(standarddialframe);

		GradientPaint gradientpaint = new GradientPaint(new Point(),
				new Color(255, 255, 255), new Point(), new Color(170, 170,
						220));
		DialBackground dialbackground = new DialBackground(gradientpaint);
		dialbackground
				.setGradientPaintTransformer(new StandardGradientPaintTransformer(
						GradientPaintTransformType.VERTICAL));
		dialplot.setBackground(dialbackground);

		DialTextAnnotation dialtextannotation = new DialTextAnnotation(
				"Meta");
		dialtextannotation.setFont(new Font("Dialog", 1, 14));
		dialtextannotation.setRadius(0.15D);
		dialplot.addLayer(dialtextannotation);

		Integer meta = 10000;
		DialTextAnnotation dialtextaMeta = new DialTextAnnotation("R$ "
				+ meta + "mi");
		dialtextaMeta.setFont(new Font("Dialog", 0, 14));
		dialtextaMeta.setRadius(0.30D);
		dialplot.addLayer(dialtextaMeta);

		StandardDialScale standarddialscale = new StandardDialScale(0, 150,
				270D, -300D, 10D, 1);
		standarddialscale.setTickRadius(0.88D);
		standarddialscale.setTickLabelOffset(0.18999999999999999D);
		standarddialscale.setTickLabelFont(new Font("Dialog", 0, 12));
		standarddialscale.setTickLabelFormatter(DecimalFormat
				.getNumberInstance());
		dialplot.addScale(0, standarddialscale);

		dialplot.mapDatasetToScale(1, 1);

		StandardDialRange standarddialrange = new StandardDialRange(100D,
				150D, Color.GREEN);

		standarddialrange.setScaleIndex(0);

		standarddialrange.setInnerRadius(0.50999999999999997D);
		standarddialrange.setOuterRadius(0.50999999999999997D);
		dialplot.addLayer(standarddialrange);
		
		StandardDialRange standarddialrangeb = new StandardDialRange(0D,
				100D, Color.RED);
		
		standarddialrangeb.setScaleIndex(0);

		standarddialrangeb.setInnerRadius(0.50999999999999997D);
		standarddialrangeb.setOuterRadius(0.50999999999999997D);
		dialplot.addLayer(standarddialrangeb);

		StandardDialScale standarddialscale1 = new StandardDialScale();
		standarddialscale1.setTickRadius(0.5D);
		standarddialscale1.setTickLabelOffset(0.14999999999999999D);
		standarddialscale1.setTickLabelFont(new Font("Dialog", 0, 10));
		standarddialscale1.setMajorTickPaint(Color.red);
		standarddialscale1.setMinorTickPaint(Color.red);
		dialplot.addScale(1, standarddialscale1);
		dialplot.mapDatasetToScale(1, 1);

		org.jfree.chart.plot.dial.DialPointer.Pointer pointer = new org.jfree.chart.plot.dial.DialPointer.Pointer(
				0);
		dialplot.addPointer(pointer);

		org.jfree.chart.plot.dial.DialPointer.Pointer pin = new org.jfree.chart.plot.dial.DialPointer.Pointer(
				1);
		
		dialplot.addPointer(pin);
		
		JFreeChart jfreechart = new JFreeChart(dialplot);
		ChartPanel chartpanel = new ChartPanel(jfreechart);
		chartpanel.setPreferredSize(new Dimension(400, 400));						
		
		return jfreechart;
	}
}

O que pode estar acontencendo? Não da erro nenhum porém não mostra na tela.

Esqueci de falar, pelo Servlet rodando ele direto funciona, abrindo pelo JSF que não mostra nada…

Chamada JSF

<h:panelGroup style="text-align: center">
				<h:graphicImage value="/graficoJFreeChartServlet" />
				<br />
			</h:panelGroup>

Deu certo galera estava em cache…