我很难理解如何从数据库中显示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的表交互,该表具有以下值(国家名称,钻机数量,日期):
国家名称:USA, USA, France, France钻机编号:2、20、40、200
当运行代码时,在结果图中只有两个数据点被拾取。这是2和200,图表系列的其他部分似乎被忽略了。调试器显示地图被正确填充,图表系列("钻机")也被正确填充。这表明问题在于我将系列添加到CartesianChartrmodel实例(' carchart ')的方式。如果你能告诉我哪里做错了,我会很感激的。在一个更广泛的问题上,我可以在哪里阅读一些关于使用JPA从CRUD操作实现PF图表的材料。提前感谢。
Kukeltje的评论帮助我找到了答案。在我的原始方法中,CartesianChartModel的初始化发生在方法的开始。由于这个create方法是由bean getter方法调用的,因此在创建开始时初始化模型实例似乎会产生几个循环效果,从而导致增强的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);
}
}
例如,如果要显示条形图,则图表系列可以是一组条形图。因此,您必须在for..循环中为每个柱设置数据,并在此循环之后将图表系列添加到模型中。您可以在图表模型中添加多个系列(一组柱)。
代码可以是:
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;
}