Pessoal,
Estou tentando gerar dashboards a partir do bean e mostrá-lo via XHTML.
package br.com.testes.model;
import java.io.File;
import java.io.FileInputStream;
import java.io.Serializable;
import javax.faces.application.Application;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.context.FacesContext;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.primefaces.component.dashboard.Dashboard;
import org.primefaces.component.graphicimage.GraphicImage;
import org.primefaces.component.panel.Panel;
import org.primefaces.model.DashboardColumn;
import org.primefaces.model.DashboardModel;
import org.primefaces.model.DefaultDashboardColumn;
import org.primefaces.model.DefaultDashboardModel;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
@ManagedBean(name="dash")
@RequestScoped
public class DashboardsBean implements Serializable {
private static final long serialVersionUID = 6730611213593761910L;
public static final int DEFAULT_COLUMN_COUNT = 3;
private int columnCount = DEFAULT_COLUMN_COUNT;
private Dashboard dashboard;
private DashboardModel model;
private GraphicImage graphicImage;
private StreamedContent chart;
public DashboardsBean() {
model = new DefaultDashboardModel();
FacesContext fc = FacesContext.getCurrentInstance();
Application application = fc.getApplication();
dashboard = (Dashboard) application.createComponent(fc, "org.primefaces.component.Dashboard", "org.primefaces.component.DashboardRenderer");
dashboard.setId("dashboard");
for (int i = 0, n = getColumnCount(); i < n; i++) {
DashboardColumn column = new DefaultDashboardColumn();
model.addColumn(column);
}
dashboard.setModel(model);
int items = 5;
for (int i = 0, n = items; i < n; i++) {
Panel panel = (Panel) application.createComponent(fc, "org.primefaces.component.Panel", "org.primefaces.component.PanelRenderer");
panel.setId("measure_" + i);
panel.setHeader("Dashboard Component " + i);
panel.setClosable(false);
panel.setToggleable(false);
getDashboard().getChildren().add(panel);
DashboardColumn column = model.getColumn(i % getColumnCount());
column.addWidget(panel.getId());
HtmlOutputText text = new HtmlOutputText();
text.setValue("Dashboard widget bits!");
if(i == 0){
teste();
//graphicImage = new GraphicImage();
graphicImage = (GraphicImage) application.createComponent(fc, "org.primefaces.component.GraphicImage", "org.primefaces.component.GraphicImageRenderer");
graphicImage.setValue(getChart());
graphicImage.setCache(true);
graphicImage.setId("img_"+i);
panel.getChildren().add(graphicImage);
}else{
panel.getChildren().add(text);
}
}
}
public void teste(){
try{
JFreeChart jfreechart = ChartFactory.createPieChart("Turkish Cities", createDataset(), true, true, false);
File chartFile = new File("dynamichart");
ChartUtilities.saveChartAsPNG(chartFile, jfreechart, 375, 300);
setChart(new DefaultStreamedContent(new FileInputStream(chartFile), "image/png"));
}catch (Exception e) {
e.printStackTrace();
}
}
private PieDataset createDataset() {
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("Istanbul", new Double(45.0));
dataset.setValue("Ankara", new Double(15.0));
dataset.setValue("Izmir", new Double(25.2));
dataset.setValue("Antalya", new Double(14.8));
return dataset;
}
public String abrirPage(){
return "relatorios";
}
public Dashboard getDashboard() {
return dashboard;
}
public DashboardModel getModel() {
return this.model;
}
public void setDashboard(Dashboard dashboard) {
this.dashboard = dashboard;
}
public int getColumnCount() {
return columnCount;
}
public void setColumnCount(int columnCount) {
this.columnCount = columnCount;
}
public GraphicImage getGraphicImage() {
return graphicImage;
}
public void setGraphicImage(GraphicImage graphicImage) {
this.graphicImage = graphicImage;
}
public StreamedContent getChart() {
return chart;
}
public void setChart(StreamedContent chart) {
this.chart = chart;
}
}
E no XHTML
<h:form id="frmInbox">
<p:dashboard id="board0" model="#{dash.model}" binding="#{dash.dashboard}">
</p:dashboard>
</h:form>
O que ocorre é que. os dashboards estão sendo criados.
Só que tento adicionar dentro do 1º dashboard o Chart criado e o dashboard não mostra o chart. O chart está sendo gerado com o exemplo do Showcase do primefaces.
Quando faço uma exibição direta no xhtml fora do dashboard o graphiImage com o Chart ele é exibido normalmente.
Alguém já fez algo desse tipo, dinâmico?
Pode me ajudar a encontrar onde está faltando ajuste.
Ou tem algum outro exemplo que funcione?
Obrigado