2014-07-03 45 views
1

我正在使用JFreeChart。將系列可見性設置爲False也會將其從圖例中隱藏

當我點擊一個圖例項目,我已經把一個監聽器。在聽衆中,我使被點擊的系列無法呈現。但作爲一個副作用,這個系列也從傳說中消失了。

我不希望系列從傳說中消失。我能做什麼以便我可以在劇情中顯示/隱藏系列,但不會影響圖例。

將圖例設置爲使用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); 
      //*/   
     } 
    } 
}); 
+0

爲什麼要投票? – codeNinja

回答

2

正是在XYPlot的類,它的可見性檢查getLegendItems()方法,所以你可以繼承XYPlot和重寫此方法(或者,如果你想建立的JFreeChart自己的自定義版本直接修改)。

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); 
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); 
    } 
    } 
相關問題