单击primefaces条形图中的任何条形时如何获取条形数据

时间:2015-02-02 14:37:07

标签: primefaces charts jqplot

我正在使用Primefaces Barchart,我希望在链接到条形图中的任何栏时显示ChartSeries中的数据。我的代码如下:

<p:chart type="bar" model="#{dailyreport.horizontalBarChart}"  rendered="#{dailyreport.chartDate != null}"  style="height:900px;width:900px;" widgetVar="bchart">
</p:chart>

和horizo​​ntalBarChart我设置了Map for Series和地图中的值就像(&#34; 00:14&#34;,10)。

我知道关于primefaces交互式图表但是如何获得在图表中点击的特定项目数据。我设法做了以下事情:

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从地图中获取该特定项目?

2 个答案:

答案 0 :(得分:1)

问题(现在基本上是普通的java ;-))是ChartSeries上的getData()由LinkedHashMap支持,而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)。

(这是有效的,我刚刚测试过)

答案 1 :(得分:1)

我已经这样做了:

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());