我很难理解如何从数据库中显示PF图表。 PF用户文档主要涵盖了如何静态生成图表的示例(即:通过硬编码值)。在这个网站上,我只看到了一些关于如何从数据库生成PF图表的问题。我发现这个问题很有用:
PrimeFaces Chart From Database
但它并没有真正解释从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的表进行交互,该表具有以下值(国家名称,钻机数量,日期):
国家/地区名称:美国,美国,法国,法国 钻机数量:2,20,40,200
运行代码时,结果图中只会拾取两个数据点。这些是2和200,其余的图表系列似乎被忽略了。调试器显示正确填充了地图,并且还正确填充了图表系列('rigs')。这表明问题在于我将系列添加到CartesianChartrmodel实例('cartChart')的方式。非常感谢任何关于我出错的建议。在更广泛的问题上,我可以阅读有关使用JPA从CRUD操作实现PF图表的一些材料的任何建议。提前致谢。
答案 0 :(得分:1)
Kukeltje的评论帮助我找到了答案。在我的原始方法中,CartesianChartModel的初始化发生在方法的开头。由于这个create方法是由bean getter方法调用的,因此在create的开头初始化模型实例似乎有几个循环效果,导致增强的for循环将地图中的每个记录视为一个系列。这意味着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);
}
}
答案 1 :(得分:0)
例如,如果要显示条形图,则图表系列可以是一组条形图。因此,您必须为for..loop中的每个条形设置数据,并在此循环之后将图表系列添加到模型中。 您可以在图表模型中添加许多系列(条形图集)。
代码可以是:
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;
}
我希望这会有所帮助。