Pessoal, bom dia;
Gostaria de saber se alguém tem algum exemplo de jFreeChart com JSF e que pudesse me passar ou coisa do tipo, me explicar. Estou tendo dificuldades de chamar o gráfico.
Pessoal, bom dia;
Gostaria de saber se alguém tem algum exemplo de jFreeChart com JSF e que pudesse me passar ou coisa do tipo, me explicar. Estou tendo dificuldades de chamar o gráfico.
Pessoal consegui usar o jFreeChart, é tipo vc cria o gráfico nomalmente e depois vc cria um array de byte pra poder jogar no campo aJax4JSF a:mediaOutput. Ele recebe o value da imagem, mas vc tem que passar um OutputStream e um object.
Bacana demais!!!
[quote=thokk]Pessoal consegui usar o jFreeChart, é tipo vc cria o gráfico nomalmente e depois vc cria um array de byte pra poder jogar no campo aJax4JSF a:mediaOutput. Ele recebe o value da imagem, mas vc tem que passar um OutputStream e um object.
Bacana demais!!![/quote]
Cara…estou com a mesma dúvida. Você poderia postar o trecho de código com a sulução adotada?
Grato desde já!!!
public void chart(OutputStream out, Object data) throws IOException {
BufferedImage result = createChart();
result.flush();
ImageIO.write(result, "JPG", out);
}
public static BufferedImage createChart() {
BufferedImage buf = null;
//Pizza o gráfico
/*DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("Red Hat", new Integer(33));
dataset.setValue("Debian", new Integer(33));
dataset.setValue("Suse", new Integer(33));
JFreeChart chart = ChartFactory.createPieChart(
"Linux Market Share - Room for everyone!", dataset, true, true,
true);*/
//Este daqui é o de Barras
/*final StatisticalCategoryDataset dataset = createDataset();
final CategoryAxis x = new CategoryAxis("Type");
x.setLowerMargin(0.01d); // percentage of space before first bar
x.setUpperMargin(0.01d); // percentage of space after last bar
x.setCategoryMargin(0.05d); // percentage of space between categories
final ValueAxis y = new NumberAxis("Value");
// define the plot
final CategoryItemRenderer renderer = new StatisticalBarRenderer();
final CategoryPlot plot = new CategoryPlot(dataset, x, y, renderer);
final JFreeChart chart = new JFreeChart("Statistical Bar Chart Demo",
JFreeChart.DEFAULT_TITLE_FONT,
plot,
true);*/
//Gráfioc de Barras 3d + marker
DefaultCategoryDataset dataset = createDataset();
JFreeChart chart = ChartFactory.createBarChart3D
("Comparison between Students","Students", "Marks",
dataset, PlotOrientation.VERTICAL, true,true, false);
//Teste da grade
CategoryPlot cp = chart.getCategoryPlot();
NumberAxis rangeAxis = (NumberAxis) cp.getRangeAxis();
rangeAxis.setUpperMargin(0.15);
cp.setBackgroundPaint(Color.lightGray);
cp.setDomainGridlinePaint(Color.black);
cp.setDomainGridlinesVisible(true);
cp.setRangeGridlinePaint(Color.white);
Marker marker = new ValueMarker(5.0);
marker.setLabel("text on the line");
marker.setLabelFont(new Font("SansSerif", Font.ITALIC, 11));
marker.setLabelAnchor(RectangleAnchor.LEFT);
marker.setLabelTextAnchor(TextAnchor.CENTER_LEFT);
marker.setPaint(Color.red);
cp.addRangeMarker(marker);
//fim de teste
int colorCode = 0x00FFFFFF;
chart.setBackgroundPaint(new Color(colorCode));
chart.getTitle().setPaint(Color.black);
CategoryPlot p = chart.getCategoryPlot();
p.setRangeGridlinePaint(Color.black);
//Aqui é codigo antigo
chart.setBorderVisible(true);
chart.setBorderPaint(Color.black);
buf = chart.createBufferedImage(300, 300);
return buf;
}
private static DefaultCategoryDataset createDataset() {
final DefaultCategoryDataset result = new DefaultCategoryDataset();
result.addValue(10.0, "IBM", "2006");
return result;
}
e o JSF
<a:mediaOutput element="img" cacheable="false" session="true"
createContent="#{graficoMB.chart}"
mimeType="image/jpeg" style="width: 300px; height: 300px;"/>
Aqui o ajax4JSF tem que estar dentro do a:form ok. Acho que isso pode te ajudar.
[quote=thokk][code]
public void chart(OutputStream out, Object data) throws IOException {
BufferedImage result = createChart();
result.flush();
ImageIO.write(result, “JPG”, out);
}
public static BufferedImage createChart() {
BufferedImage buf = null;
//Pizza o gráfico
/*DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("Red Hat", new Integer(33));
dataset.setValue("Debian", new Integer(33));
dataset.setValue("Suse", new Integer(33));
JFreeChart chart = ChartFactory.createPieChart(
"Linux Market Share - Room for everyone!", dataset, true, true,
true);*/
//Este daqui é o de Barras
/*final StatisticalCategoryDataset dataset = createDataset();
final CategoryAxis x = new CategoryAxis("Type");
x.setLowerMargin(0.01d); // percentage of space before first bar
x.setUpperMargin(0.01d); // percentage of space after last bar
x.setCategoryMargin(0.05d); // percentage of space between categories
final ValueAxis y = new NumberAxis("Value");
// define the plot
final CategoryItemRenderer renderer = new StatisticalBarRenderer();
final CategoryPlot plot = new CategoryPlot(dataset, x, y, renderer);
final JFreeChart chart = new JFreeChart("Statistical Bar Chart Demo",
JFreeChart.DEFAULT_TITLE_FONT,
plot,
true);*/
//Gráfioc de Barras 3d + marker
DefaultCategoryDataset dataset = createDataset();
JFreeChart chart = ChartFactory.createBarChart3D
("Comparison between Students","Students", "Marks",
dataset, PlotOrientation.VERTICAL, true,true, false);
//Teste da grade
CategoryPlot cp = chart.getCategoryPlot();
NumberAxis rangeAxis = (NumberAxis) cp.getRangeAxis();
rangeAxis.setUpperMargin(0.15);
cp.setBackgroundPaint(Color.lightGray);
cp.setDomainGridlinePaint(Color.black);
cp.setDomainGridlinesVisible(true);
cp.setRangeGridlinePaint(Color.white);
Marker marker = new ValueMarker(5.0);
marker.setLabel("text on the line");
marker.setLabelFont(new Font("SansSerif", Font.ITALIC, 11));
marker.setLabelAnchor(RectangleAnchor.LEFT);
marker.setLabelTextAnchor(TextAnchor.CENTER_LEFT);
marker.setPaint(Color.red);
cp.addRangeMarker(marker);
//fim de teste
int colorCode = 0x00FFFFFF;
chart.setBackgroundPaint(new Color(colorCode));
chart.getTitle().setPaint(Color.black);
CategoryPlot p = chart.getCategoryPlot();
p.setRangeGridlinePaint(Color.black);
//Aqui é codigo antigo
chart.setBorderVisible(true);
chart.setBorderPaint(Color.black);
buf = chart.createBufferedImage(300, 300);
return buf;
}
private static DefaultCategoryDataset createDataset() {
final DefaultCategoryDataset result = new DefaultCategoryDataset();
result.addValue(10.0, "IBM", "2006");
return result;
}
[/code]
e o JSF
<a:mediaOutput element="img" cacheable="false" session="true"
createContent="#{graficoMB.chart}"
mimeType="image/jpeg" style="width: 300px; height: 300px;"/>
Aqui o ajax4JSF tem que estar dentro do a:form ok. Acho que isso pode te ajudar.[/quote]
Obrigado pela ajuda tokk. Eu copiei seu método que constrói o gráfico para o meu bean mas quando o método é chamada pela página para exibir a imagem a mesma não é exibida (surge na tela o icone com um “x” indicando que a imagem não pôde ser carregada).
Segue a página que exibe o gráfico:
<h:panelGroup id="panelGroupDeVisao" rendered="#{chartGeneratorBean.viewing}">
<f:subview id="viewVisao">
<table class="tabela">
<tr>
<td class="tdCor" width="15%"><h:outputText value="#{bundle.lbl_description}" /></td>
<td class="tdBranco" width="85%"><h:outputText value="#{chartGeneratorBean.entity.description}" /> </td>
</tr>
<tr align="center">
<a4j:mediaOutput element="img" cacheable="false" session="true"
createContent="#{chartGeneratorBean.showChart}" mimeType="image/jpeg"/>
</tr>
</table>
</f:subview>
</h:panelGroup>
O método showChart é uma cópia do seu. Já tente por o <h:panelGroup> dentro de um a4j:form mas o erro ainda persiste.
Tenta tirar o rendered do panelgroup, pois a chamada tem que ser apenas no mediaoutput. Pois ele vai receber a imagem que e gerada pelo metodo que BufferedImage entao ele tem que pegar o resultado do metodo que recebe o grafico e converte ele para imagem. Tenta isso, caso retorne o erro, posta o codigo do seu MB.
Vlws…
[quote=thokk]Tenta tirar o rendered do panelgroup, pois a chamada tem que ser apenas no mediaoutput. Pois ele vai receber a imagem que e gerada pelo metodo que BufferedImage entao ele tem que pegar o resultado do metodo que recebe o grafico e converte ele para imagem. Tenta isso, caso retorne o erro, posta o codigo do seu MB.
Vlws…[/quote]
thokk…o erro ainda persite mesmo retirando o rendered. O método do meu MBean está assim:
[code]
public void showChart(OutputStream out, Object data) throws IOException
{
JFreeChart chart = null;
JSFUtil jsfUtil = new JSFUtil();
this.setEntity((ChartVo)jsfUtil.getSession().getAttribute("chartVo"));
try
{
if(this.getEntity() != null)
{
ChartVo chartVo = this.getEntity();
//verifica de acordo com o tipo de gráfico qual classe de negócio deve ser chamada.
int type = chartVo.getType().getValor();
if(type == Constants.PIE_TYPE_CHART)
{
PieChartNgc pieChartNgc = PieChartNgc.getInstance();
PieChartVo pieChartVo = new PieChartVo();
pieChartVo.setId(chartVo.getId());
List<PieChartVo> search = pieChartNgc.search(pieChartVo, 0);
chart = pieChartNgc.generateChart(search.get(0));
}
}
//ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedImage image = chart.createBufferedImage(500, 375, BufferedImage.TYPE_INT_RGB, null);
ImageIO.write(image, "jpeg", out);
}
catch(R3AException e)
{
FacesMessage message = new FacesMessage(e.getMensagem());
message.setSeverity(FacesMessage.SEVERITY_ERROR);
FacesContext.getCurrentInstance().addMessage("", message);
}
} [/code]
O método pieChartNgc.generateChart me retorna um objeto do tipo chart.
image.flush(); coloca isso acho que deve ser preciso ter isso depois do seu bufferImage.
Cara já tentei fazer isso também mas não funcionou. Como estou com urgência e não consegui usar a tag, fiz usando a tag graphicImage mesmo.
De qualquer forma muito obrigado pela ajuda
[]'s
Cara já tentei fazer isso também mas não funcionou. Como estou com urgência e não consegui usar a tag, fiz usando a tag graphicImage mesmo.
De qualquer forma muito obrigado pela ajuda
[]'s[/quote]
Estou com um problema bem parecido, como você usou a tag <h:graphicImage/> ao invez da a4j:mediaOutput/.
Eu tento usar a tag a4j mas não renderiza a imagem, se alguém tiver alguma dica…
Managed Bean
[code]import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.OutputStream;
import javax.imageio.ImageIO;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;
public class ChartBean {
public void chart(OutputStream out, Object data) throws Exception {
BufferedImage pageImage = gerarGraficoPie();
pageImage.flush();
ImageIO.write(pageImage, "jpeg", out);
}
public static BufferedImage gerarGraficoPie() throws Exception {
BufferedImage buf = null;
try {
DefaultPieDataset ds = new DefaultPieDataset();
ds.setValue("Norte", 13000000);
ds.setValue("Nordeste", 48000000);
ds.setValue("Centro-Oeste", 11000000);
ds.setValue("Sudeste", 73000000);
ds.setValue("Sul", 25500000);
JFreeChart chart =
ChartFactory.createPieChart("População Nacional", ds, true, false, false);// create your chart
chart.setBackgroundPaint(Color.white);
chart.setBorderVisible(true);
chart.setBorderPaint(Color.gray);
buf = chart.createBufferedImage(400,250,BufferedImage.TYPE_INT_RGB, null);
buf.flush();
} catch (Exception e) {
throw new Exception(e);
}
return buf;
}
}[/code]
JSP : a4j:mediaOutput/
[code]<%@ page language=“java” contentType=“text/html;charset=UTF-8” pageEncoding=“UTF-8”%>
<%@ taglib uri=“http://java.sun.com/jsf/core” prefix=“f”%>
<%@ taglib uri=“http://java.sun.com/jsf/html” prefix=“h”%>
<%@ taglib uri=“http://richfaces.org/a4j” prefix=“a”%>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
OU
JSP :<h:graphicImage/>
[code]<%@ page language=“java” contentType=“text/html;charset=UTF-8” pageEncoding=“UTF-8”%>
<%@ taglib uri=“http://java.sun.com/jsf/core” prefix=“f”%>
<%@ taglib uri=“http://java.sun.com/jsf/html” prefix=“h”%>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
tiles-definitions
<tiles-definitions>
<!-- ### Mecanismo de Grárficos ### -->
<definition name="/charts.tiles">
<put name="body" value="/content/exemple/componentesApresentacao/charts/charts.jsp" />
</definition>
</tiles-definitions>
faces-navigation-config.xml
<faces-config>
<navigation-rule>
<navigation-case>
<from-outcome>charts</from-outcome>
<to-view-id>/charts.tiles</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
faces-managedbean-config.xml
<faces-config>
<managed-bean>
<managed-bean-name>chartBean</managed-bean-name>
<managed-bean-class>br.com.exemple.view.bean.ChartBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
</faces-config>
Preciso de ajuda…
Abraços.
Ola pessoal!
Belezinha? Pessoal, tambem estou tentando imprimir pequenos graficos feitos em JSF dentro de uma rich:datatable. Porem, neste exemplo citado acima voces estao chamando o metodo createContent="#{dialChart.chart}" dentro do a4j:mediaOutput, mas este metodo deve receber alguns parametros certo? que parametros sao esses? Como passo esses parametros?
Grato desde ja
Tente colocar apenas isso dentro do seu dataTable:
<a:mediaOutput element="img" cacheable="false" session="true"
createContent="#{graficoMB.chart}"
mimeType="image/jpeg" style="width: 300px; height: 300px;"/>
O gráfico vai ter o perfeito funcionamento.
Salve thokk! Show de bola cara! pegou que eh uma beleza! Nao sei porque mas o grafico esta saindo avermelhado, tem nocao o que pode ser?
Vlwzasso cara!
Abracos
Tenta mudar de image/jpeg para image/png.
Fala thokk! Cara mais uma vez SHOW! foi pimba! Vlwzasso pela dica parceiro!
Abraçao
Fala thokk! Belezura parceiro? Cara to enfretando outro pepino agora. Tipo, quando gero a imagem pela primeira vez na minha pagina ta blz! mas dai cara quando eu atualizo a pagina e tento gerar outro grafico, aparece o mesmo grafico de antes e nao modifica os valores. Tem nocao o que pode ser cara?
Abracao
Provavel de vc ter que matar o seu objeto e criar um novo.
[code]setObjeto(null);
public Objeto getObjeto(){
if(objeto == null){
objeto = new Objeto();
}
}[/code]
Que objeto seria esse thokk? Ta acontecendo o seguinte,apos eu atualizar a pagina, a pagina renderiza o grafico porem o mesmo de antes, ela nem acessa o metodo que desenha o grafico! To gerando uma imagem png.
Desde ja grato