选择要显示的一系列数据

我有一个包含多个数据系列的情节:

在此处输入图像描述

我希望能够选择我想要显示的系列。 例如,仅20° 。 有没有一种简单的方法可以通过在不使用JCheckBox情况下操作图表来实现这一目的? 我希望能够这样做,例如,点击系列的图例。

如此处所示, JCheckBox更灵活,但直接在图表上单击可能更方便。 下面的示例添加了一个ChartMouseListener ,当单击系列中的XYItemEntity或其LegendItemEntity ,该系列使一个系列不可见。 当然,一旦一个系列看不见,它就不能再被点击了; 你需要一种方法来恢复可见性。 在一些替代方案中,第一个如下所示:

  • 单击图表上的其他位置时,还原所有系列的可见性。

  • 将此与上面引用的方法相结合,在chartMouseClicked()实现中相应地切换JCheckBox

  • 在按钮处理程序中循环播放该系列,恢复每个处理程序的可见性。

图片

 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); } }