[英]Correctly displaying and using Primefaces bar chart from database
我很难理解如何从数据库中显示 PF 图表。 PF 用户文档主要涵盖了如何静态生成图表的示例(即:通过硬编码值)。 在这个站点上,我只看到了一些关于如何从数据库生成 PF 图表的问题。 我发现这个问题很有帮助:
但它并没有真正解释从 DB 正确实现 PF 图表所需的逻辑和方法。 我自己尝试了以下示例。 观点是:
<p:panel>
<p:barChart value="#{rigtestBean.cartChart}"/>
</p:panel>
托管 bean 方法:
public CartesianChartModel createRigTestModel() {
cartChart = new CartesianChartModel();
ChartSeries rigs = new ChartSeries();
List<Rigtest> rList = rigFacade.findAll();
Map<Object, Number> rigMap = new HashMap<>();
for(Rigtest o: rList) {
rigMap.put(o.getCountry().getCountryname(), o.getRignum());
rigs.setData(rigMap) ;
cartChart.addSeries(rigs);
}
return cartChart;
}
以上与名为 RigTest 的表交互,该表具有以下值(国家名称、钻机数量、日期):
国家名称:USA、USA、France、France 钻机编号:2、20、40、200
运行代码时,在结果图中只选取了两个数据点。 这些是 2 和 200,图表系列的其余部分似乎被忽略了。 调试器显示地图已正确填充,并且图表系列(“钻机”)也已正确填充。 这表明问题在于我将系列添加到 CartesianChartrmodel 实例('cartChart')的方式。 非常感谢有关我哪里出错的任何建议。 在更广泛的问题上,我可以在何处阅读有关使用 JPA 从 CRUD 操作实现 PF 图表的一些材料的任何建议。 提前致谢。
Kukeltje 的评论帮助我找到了答案。 在我原来的方法中,CartesianChartModel 的初始化发生在方法的开头。 由于这个create方法是被bean getter方法调用的,所以在create开始时初始化模型实例似乎有几个循环的效果,导致增强的for循环把map中的每条记录都当成一个系列。 这意味着 6 条记录循环 36 次,7 条记录循环 49 次,依此类推。
在 for 循环和地图填充之后初始化模型实例似乎可以解决问题并在条形图中产生正确数量的记录。
public void createRigTestModel() {
ChartSeries rigs = new ChartSeries();
List<Rigtest> rList = rigFacade.findAll();
Map<Object, Number> rigMap = new HashMap<>();
for (Rigtest o : rList) {
rigMap.put(o.getRigtestid(), o.getRignum());
cartChart = new CartesianChartModel();
rigs.setData(rigMap);
cartChart.addSeries(rigs);
}
}
例如,如果要显示条形图,chartseries 可以是一组条形图。 因此,您必须为 for..loop 内的每个条设置数据,并在此循环之后将 chartseries 添加到模型中。 您可以向图表模型添加许多系列(一组条形)。
代码可能是:
public CartesianChartModel createRigTestModel() {
cartChart = new CartesianChartModel();
ChartSeries rigs = new ChartSeries();
List<Rigtest> rList = rigFacade.findAll();
for(Rigtest o: rList) {
rigs.set(o.getCountry().getCountryname(), o.getRignum());
}
cartChart.addSeries(rigs);
return cartChart;
}
我希望这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.