【问题标题】:how to get bar data when clicked on any bar in primefaces barchart单击primefaces条形图中的任何条时如何获取条形数据
【发布时间】:2015-02-02 14:37:07
【问题描述】:

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

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

我正在为 Series 设置 Map 的 Horizo​​ntalBarChart,地图中的值类似于 ("00:14",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 从地图中获取特定项目?

【问题讨论】:

    标签: primefaces charts jqplot


    【解决方案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());
    

    【讨论】:

    • 正确,这确实有效(正如我在回答中发布的那样,这是一个普通的 java 问题)。我将在 PF 问题列表中提出问题,以将 getData(index) 添加到图表模型...
    • @Kukeltje 感谢您的指导。
    【解决方案2】:

    问题(现在基本上是一个普通的 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)。

    (这个可行,我刚刚测试过)

    【讨论】:

    • 是的,我知道这一点,但如何获取用户点击的特定项目。
    • 如何获取带有项目索引的地图条目?
    • 嗯,这同样简单...一切都在 api 中...您可以使用ChartSeries mySeries = model.getSeries().get(event.getSeriesIndex()) 进入系列,然后使用mySeries.getData() 进入 LinkedHashMap。并在此链接的 hasmap 上使用 event.getItemIndex() 就像在 here 中一样,您具有价值...感谢您告诉我们顺便说一句,我第一次发布的内容已经为人所知
    • 请记住,在填充模型时,您需要自己跟踪索引与哈希映射键。然后您可以根据索引获取密钥,然后执行mySeries.getData().get(key)。也许扩展 ChartSeries 以自行执行此操作也可以(虽然没有时间尝试)
    • 如果此答案解决了您的问题,请单击此答案旁边的绿色复选标记。还有see how accepting an answer works@NomanKhurram
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多