【问题标题】:Choose the series of data that you want to display选择要显示的数据系列
【发布时间】:2017-04-07 13:22:44
【问题描述】:

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

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

【问题讨论】:

  • 系列标签是否表示图表的图例
  • @trashgod 是的,抱歉不清楚

标签: java swing plot jfreechart


【解决方案1】:

如图hereJCheckBox更灵活,但直接点击图表可能更方便。下面的示例添加了一个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);
    }
}

【讨论】:

  • 代码对你有用吗? getSeriesKey()getSeriesIndex() 在这两行中无法识别:Comparable key = item.getSeriesKey(); renderer.setSeriesVisible(dataset.getSeriesIndex(key), false);
  • 是的;我刚刚用jfreechart 1.0.19 版检查了发布的代码。
  • 我的错,我的JFreeChart 版本有问题。无论如何,感谢您的回答,这正是我想要的。我认为我会将这两种解决方案结合起来,以获得最佳的用户体验!
猜你喜欢
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多