[英]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.