2017-04-07 64 views
1

我有多個系列數據的曲線數據:選擇一系列要顯示

enter image description here

我希望能夠挑選我想要顯示的系列。例如,只有20°。有沒有簡單的方法來通過操縱圖表而不使用JCheckBox來做到這一點?我希望能夠做到這一點,例如,通過點擊系列的圖例。

+0

_label該系列_的是否意味着圖表的_legend_? – trashgod

+0

@trashgod是的,抱歉,它不明確 – pioupiou1211

回答

2

如圖所示here,JCheckBox更靈活,但直接點擊圖表可能會更方便。下面的示例添加了一個ChartMouseListener,當點擊該系列中的XYItemEntity或其LegendItemEntity時,系列將不可見。當然,一個系列是不可見的,它不能再被點擊;你需要一種方法來恢復可視性。在一些替代方案中,第一個如下所示:

  • 在單擊圖表中的其他位置時恢復所有系列的可見性。

  • 將此與上面引用的方法相結合,相應地在執行chartMouseClicked()時切換JCheckBox

  • 在按鈕處理函數中循環遍歷系列,恢復每個系列的可見性。

image

import java.awt.Dimension; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import org.jfree.chart.ChartMouseEvent; 
import org.jfree.chart.ChartMouseListener; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.axis.NumberAxis; 
import org.jfree.chart.entity.ChartEntity; 
import org.jfree.chart.entity.LegendItemEntity; 
import org.jfree.chart.entity.XYItemEntity; 
import org.jfree.chart.labels.StandardXYToolTipGenerator; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.data.xy.XYSeriesCollection; 

/** @see https://stackoverflow.com/a/43286042/230513 */ 
public class VisibleTest { 

    private void display() { 
     JFrame f = new JFrame("Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     XYSeriesCollection dataset = new XYSeriesCollection(); 
     for (int i = 0; i < 3; i++) { 
      XYSeries series = new XYSeries("value" + i); 
      for (double t = 0; t < 2 * Math.PI; t += 0.5) { 
       series.add(t, Math.sin(t) + i); 
      } 
      dataset.addSeries(series); 
     } 
     NumberAxis xAxis = new NumberAxis("domain"); 
     NumberAxis yAxis = new NumberAxis("range"); 
     XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(true, true); 
     renderer.setBaseToolTipGenerator(new StandardXYToolTipGenerator()); 
     XYPlot plot = new XYPlot(dataset, xAxis, yAxis, renderer); 
     JFreeChart chart = new JFreeChart("Test", plot); 
     ChartPanel chartPanel = new ChartPanel(chart) { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(640, 480); 
      } 
     }; 
     chartPanel.addChartMouseListener(new ChartMouseListener() { 
      @Override 
      public void chartMouseClicked(ChartMouseEvent e) { 
       ChartEntity ce = e.getEntity(); 
       if (ce instanceof XYItemEntity) { 
        XYItemEntity item = (XYItemEntity) ce; 
        renderer.setSeriesVisible(item.getSeriesIndex(), false); 
       } else if (ce instanceof LegendItemEntity) { 
        LegendItemEntity item = (LegendItemEntity) ce; 
        Comparable key = item.getSeriesKey(); 
        renderer.setSeriesVisible(dataset.getSeriesIndex(key), false); 
       } else { 
        for (int i = 0; i < dataset.getSeriesCount(); i++) { 
         renderer.setSeriesVisible(i, true); 
        } 
       } 
      } 

      @Override 
      public void chartMouseMoved(ChartMouseEvent e) {} 
     }); 

     f.add(chartPanel); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new VisibleTest()::display); 
    } 
} 
+0

代碼是否適合您? 'getSeriesKey()'和'getSeriesIndex()'無法在這兩行中識別:'Comparable key = item.getSeriesKey(); renderer.setSeriesVisible(dataset.getSeriesIndex(key),false);' – pioupiou1211

+0

是的;我只用[tag:jfreechart]版本1.0.19檢查了發佈的代碼。 – trashgod

+0

我的不好,我的'JFreeChart'版本有問題。無論如何感謝您的回答,這正是我所期待的。我想我會結合這兩種解決方案,以獲得最佳的用戶體驗! – pioupiou1211