将系列可见性设置为False也会将其隐藏在图例中

时间:2014-07-03 20:27:16

标签: java jfreechart

我正在使用JFreeChart。

当我点击一个Legend项目时,我已经放了一个监听器。在听众中,我使被点击的系列变得无形。但作为一个副作用,该系列也从传奇中消失了。

我不希望这个系列从传说中消失。我能做些什么才能在情节上显示/隐藏系列,但不影响传奇。

使用plot.setFixedLegendItems(list)设置要修复的图例会导致其他鼠标效果停止工作(鼠标悬停在数据点上时,系列行当前变得更粗,在图例中也相同)。

chartPanel.addChartMouseListener(new ChartMouseListener() {
    @Override
    public void chartMouseClicked(ChartMouseEvent event) {
        ChartEntity entity = event.getEntity();
        if (entity instanceof LegendItemEntity) {
            //*
            LegendItemEntity itemEntity = (LegendItemEntity) entity;
            XYDataset dataset = (XYDataset) itemEntity.getDataset();
            int index = dataset.indexOf(itemEntity.getSeriesKey());
            XYPlot plot = (XYPlot) event.getChart().getPlot();

            //set the renderer to hide the series
            XYItemRenderer renderer = plot.getRenderer();
            renderer.setSeriesVisible(index, !renderer.isSeriesVisible(index), false);
            renderer.setSeriesVisibleInLegend(index, true, false);
            //*/        
        }
    }
});

3 个答案:

答案 0 :(得分:2)

getLegendItems()类中的XYPlot方法执行可见性检查,因此您可以将XYPlot子类化并覆盖此方法(或者如果要构建自己的自定义版本,则直接修改它JFreeChart)。

答案 1 :(得分:2)

您还可以呼叫getLegendItems(),将其另存为LegendItemCollection并在发生任何动作侦听器之前设置plot.setFixedLegendItems(legendItems)。通过这种方式,它可以将所有图例项目设置为初始状态,即使单击图例项目也是如此。

XYPlot plot = chart.getXYPlot();
LegendItemCollection legendItems = plot.getLegendItems();
plot.setFixedLegendItems(legendItems);
chartPanel.addChartMouseListener(new ChartMouseListener() {
  @Override
  public void chartMouseClicked(ChartMouseEvent chartMouseEvent) {
    ChartEntity entity = chartMouseEvent.getEntity();
    if (chartMouseEvent.getEntity() instanceof LegendItemEntity) {
      LegendItemEntity itemEntity = (LegendItemEntity) entity;
      XYDataset dataset = (XYDataset) itemEntity.getDataset();
      int index = dataset.indexOf(itemEntity.getSeriesKey());
      XYPlot plot = (XYPlot) chartMouseEvent.getChart().getPlot();

      //set the renderer to hide the series
      XYItemRenderer renderer = plot.getRenderer();
      renderer.setSeriesVisible(index, !renderer.isSeriesVisible(index), true);
    }
  }

答案 2 :(得分:1)

谢谢大卫。你的提示对我很有帮助,可能还有很多其他人。

我建议您更改XYPlot.getLegendItems()默认代码,这样即使在图中不可见,它也允许系列显示在图例中:

                for (int i = 0; i < seriesCount; i++) {
                    boolean v1 = renderer.isSeriesVisible(i);
                    boolean v2 = renderer.isSeriesVisibleInLegend(i);
                    if (v2) {// original code: v1 && v2
                        boolean workaround = !v1 && v2;
                        if (workaround)  renderer.setSeriesVisible(i, true, false);// temporarily enable before getLegendItem()
                        LegendItem item = renderer.getLegendItem(datasetIndex, i);
                        if (workaround)  renderer.setSeriesVisible(i, false, false);