正确显示和使用数据库中的 Primefaces 条形图

Correctly displaying and using Primefaces bar chart from database

我很难理解如何从数据库中显示 PF 图表。 PF 用户文档主要涵盖如何静态生成图表的示例(即:通过硬编码值)。在这个网站上,我只看到了几个关于如何从数据库生成 PF 图表的问题。我发现这个问题很有帮助:

PrimeFaces Chart From Database

但它并没有真正解释从数据库正确实现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 的 table 交互,它具有以下值(国家名称、钻机数量、日期):

国家名称:USA, USA, France, France 钻机数量:2、20、40、200

当运行代码时,在结果图中只拾取了两个数据点。这些是 2 和 200,图表系列的其余部分似乎被忽略了。调试器显示地图正在正确填充,图表系列 ('rigs') 也已正确填充。这表明问题在于我将系列添加到 CartesianChartrmodel 实例 ('cartChart') 的方式。非常感谢有关我哪里出错的任何建议。在更广泛的问题上,我可以在哪里阅读一些关于使用 JPA 从 CRUD 操作实现 PF 图表的建议 material。提前致谢。

Kukeltje 的评论帮助我找到了答案。在我原来的方法中, CartesianChartModel 的初始化发生在方法的开头。由于这个create方法是beangetter方法调用的,所以在create开始时初始化model实例好像有几个循环的效果,导致增强的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);

    }

}

例如,如果要显示条形图,图表系列可以是一组条形图。因此,您必须在 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;

}

希望对您有所帮助。