单击 primefaces 条形图中的任何条时如何获取条数据
how to get bar data when clicked on any bar in primefaces barchart
我正在使用 Primefaces Barchart,我想在 link 到条形图中的任何条形图时显示 ChartSeries 中的数据。我的代码如下:
<p:chart type="bar" model="#{dailyreport.horizontalBarChart}" rendered="#{dailyreport.chartDate != null}" style="height:900px;width:900px;" widgetVar="bchart">
</p:chart>
我正在为 Series 设置 Map 的 horizontalBarChart,地图中的值类似于 ("00:14",10)。
我知道 primefaces 交互式图表但是如何获取在 chart.I 中单击的特定项目数据设法做到以下几点:
public void itemSelect(ItemSelectEvent event){
Integer seriesIndex = event.getSeriesIndex();
Integer itemIndex = event.getItemIndex();
HorizontalBarChartModel cModel = (HorizontalBarChartModel) ((org.primefaces.component.chart.Chart) event.getSource()).getModel();
List<ChartSeries> cData= cModel.getSeries();
Map<Object, Number> ct = cData.get(seriesIndex).getData();
}
如何使用 itemIndex 从地图中获取特定项目?
问题(现在基本上是一个普通的 java 问题 ;-))是 ChartSeries 上的 getData() 由 LinkedHashMap 支持,它没有基于获取值的选项在索引上(即使 LinkedHashMap 维护插入顺序。因此您必须在填充模型时自己维护键和索引之间的映射,并将其保存在例如 bean 中。另一个不必每次都执行此操作的选项是时候像这样扩展 ChartSeries 了:
package some.package;
import java.util.ArrayList;
import java.util.Map;
import org.primefaces.model.chart.ChartSeries;
public class MyChartSeries extends ChartSeries {
private ArrayList<Object> indexKeyMapper = new ArrayList<>();
public void setData(Map<Object, Number> data) {
throw new RuntimeException("No, sorry");
}
public void set(Object x, Number y) {
getData().put(x, y);
indexKeyMapper.add(x);
}
public Object getKey(int index) {
return indexKeyMapper.get(index);
}
public Number getData(int index) {
return getData().get(indexKeyMapper.get(index));
}
}
然后您可以在检索到的系列上使用 getData(event.getItemIndex())(不要忘记转换为 MyChartSeries)。
(这个有效,我刚测试过)
我做过的是这样的:
HorizontalBarChartModel cModel = (HorizontalBarChartModel) ((org.primefaces.component.chart.Chart) event.getSource()).getModel();
ChartSeries mySeries = cModel.getSeries().get(event.getSeriesIndex());
Set<Entry<Object, Number>> mapValues = mySeries.getData().entrySet();
Entry<Object,Number>[] test = new Entry[mapValues.size()];
mapValues.toArray(test);
System.out.prinlnt("Key"+test[event.getItemIndex].getKey());
System.out.prinlnt("Value"+test[event.getItemIndex].getValue());
我正在使用 Primefaces Barchart,我想在 link 到条形图中的任何条形图时显示 ChartSeries 中的数据。我的代码如下:
<p:chart type="bar" model="#{dailyreport.horizontalBarChart}" rendered="#{dailyreport.chartDate != null}" style="height:900px;width:900px;" widgetVar="bchart">
</p:chart>
我正在为 Series 设置 Map 的 horizontalBarChart,地图中的值类似于 ("00:14",10)。
我知道 primefaces 交互式图表但是如何获取在 chart.I 中单击的特定项目数据设法做到以下几点:
public void itemSelect(ItemSelectEvent event){
Integer seriesIndex = event.getSeriesIndex();
Integer itemIndex = event.getItemIndex();
HorizontalBarChartModel cModel = (HorizontalBarChartModel) ((org.primefaces.component.chart.Chart) event.getSource()).getModel();
List<ChartSeries> cData= cModel.getSeries();
Map<Object, Number> ct = cData.get(seriesIndex).getData();
}
如何使用 itemIndex 从地图中获取特定项目?
问题(现在基本上是一个普通的 java 问题 ;-))是 ChartSeries 上的 getData() 由 LinkedHashMap 支持,它没有基于获取值的选项在索引上(即使 LinkedHashMap 维护插入顺序。因此您必须在填充模型时自己维护键和索引之间的映射,并将其保存在例如 bean 中。另一个不必每次都执行此操作的选项是时候像这样扩展 ChartSeries 了:
package some.package;
import java.util.ArrayList;
import java.util.Map;
import org.primefaces.model.chart.ChartSeries;
public class MyChartSeries extends ChartSeries {
private ArrayList<Object> indexKeyMapper = new ArrayList<>();
public void setData(Map<Object, Number> data) {
throw new RuntimeException("No, sorry");
}
public void set(Object x, Number y) {
getData().put(x, y);
indexKeyMapper.add(x);
}
public Object getKey(int index) {
return indexKeyMapper.get(index);
}
public Number getData(int index) {
return getData().get(indexKeyMapper.get(index));
}
}
然后您可以在检索到的系列上使用 getData(event.getItemIndex())(不要忘记转换为 MyChartSeries)。
(这个有效,我刚测试过)
我做过的是这样的:
HorizontalBarChartModel cModel = (HorizontalBarChartModel) ((org.primefaces.component.chart.Chart) event.getSource()).getModel();
ChartSeries mySeries = cModel.getSeries().get(event.getSeriesIndex());
Set<Entry<Object, Number>> mapValues = mySeries.getData().entrySet();
Entry<Object,Number>[] test = new Entry[mapValues.size()];
mapValues.toArray(test);
System.out.prinlnt("Key"+test[event.getItemIndex].getKey());
System.out.prinlnt("Value"+test[event.getItemIndex].getValue());