2017-04-07 60 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