如何在 JFreeChart 中点击绘制折线图?

How to draw a linechart on click in JFreeChart?

我可以使用 JFreeChart 绘制折线图。我想知道如何绘制带有图例的折线图。我点击的地方应该会在 JFreeChart 中动态更新。

我在这里提到了一张图片来解释我的意思。 在图像中,我可以绘制黑线,我想要的是单击时绘制的红线。谁能给我一些与此相关的建议?

提前致谢

这是示例代码。在这个我有3个系列。我正在向第二个系列添加 onclick 数据点。

import com.sun.javafx.geom.Point2D;
import com.sun.javafx.scene.paint.GradientUtils.Point;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.geom.Rectangle2D;

import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;

import org.jfree.chart.ChartFactory; 
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.ValueAxis;
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.data.xy.XYSeriesCollection; 
import org.jfree.ui.ApplicationFrame; 
import org.jfree.ui.RefineryUtilities;

public class ChartDemo extends ApplicationFrame implements ChartMouseListener {

/**
 * Creates a new demo.
 *
 * @param title  the frame title.
 */

public static ChartPanel chartPanel = null;
public static JFreeChart chart = null;
public static XYSeries series1,series2;
public ChartDemo(final String title) {

    super(title);

    final XYDataset dataset = createDataset();
    final JFreeChart chart = createChart(dataset);
    chartPanel = new ChartPanel(chart);
    chartPanel.addChartMouseListener(this);
    chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
    setContentPane(chartPanel);

 }

 /**
 * Creates a sample dataset.
 * 
 * @return a sample dataset.
 */
 private XYDataset createDataset() {

    series1 = new XYSeries("First");
    series1.add(1.0, 1.0);
    series1.add(2.0, 4.0);
    series1.add(3.0, 3.0);
    series1.add(4.0, 5.0);
    series1.add(5.0, 5.0);
    series1.add(6.0, 7.0);
    series1.add(7.0, 7.0);
    series1.add(8.0, 8.0);

    series2 = new XYSeries("Second");
    series2.add(1.0, 5.0);
    series2.add(2.0, 7.0);
    series2.add(3.0, 6.0);
    series2.add(4.0, 8.0);
    series2.add(5.0, 4.0);
    series2.add(6.0, 4.0);
    series2.add(7.0, 2.0);
    series2.add(8.0, 1.0);

    final XYSeries series3 = new XYSeries("Third");
    series3.add(3.0, 4.0);
    series3.add(4.0, 3.0);
    series3.add(5.0, 2.0);
    series3.add(6.0, 3.0);
    series3.add(7.0, 6.0);
    series3.add(8.0, 3.0);
    series3.add(9.0, 4.0);
    series3.add(10.0, 3.0);


    final XYSeriesCollection dataset = new XYSeriesCollection();
    dataset.addSeries(series1);
    dataset.addSeries(series2);
    dataset.addSeries(series3);

    return dataset;

}

/**
 * Creates a chart.
 * 
 * @param dataset  the data for the chart.
 * 
 * @return a chart.
 */
private JFreeChart createChart(final XYDataset dataset) {

    // create the chart...
     chart = ChartFactory.createXYLineChart(
        "Chart Demo",      // chart title
        "X",                      // x axis label
        "Y",                      // y axis label
        dataset,                  // data
        PlotOrientation.VERTICAL,
        true,                     // include legend
        true,                     // tooltips
        false                     // urls
    );


    chart.setBackgroundPaint(Color.white);

    final XYPlot plot = chart.getXYPlot();
    plot.setBackgroundPaint(Color.lightGray);
//    plot.setAxisOffset(new Spacer(Spacer.ABSOLUTE, 5.0, 5.0, 5.0, 5.0));
    plot.setDomainGridlinePaint(Color.white);
    plot.setRangeGridlinePaint(Color.white);

    final XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
    renderer.setSeriesLinesVisible(0, false);//to disable line on the graph
    renderer.setSeriesShapesVisible(2, false);//to disable shape on the graph

    plot.setRenderer(renderer);

    final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
    rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

    return chart;        
}


public static void main(final String[] args) 
{
    final ChartDemo demo = new ChartDemo("Chart Demo");
    demo.pack();
    RefineryUtilities.centerFrameOnScreen(demo);
    demo.setVisible(true);
}

@Override
public void chartMouseClicked(ChartMouseEvent cme) 
{
    int mouseX = cme.getTrigger().getX(); 
    int mouseY = cme.getTrigger().getY(); 
     System.out.println("x = " + mouseX + ", y = " + mouseY);   
    java.awt.geom.Point2D p = chartPanel.translateScreenToJava2D( 
            new java.awt.Point(mouseX, mouseY)); 
    XYPlot plot = (XYPlot) chart.getPlot(); 
        System.out.println("Mouse clicked!!!!!");
       Rectangle2D plotArea = this.chartPanel.getChartRenderingInfo().getPlotInfo().getDataArea();
    ValueAxis domainAxis = plot.getDomainAxis(); 
    org.jfree.chart.ui.RectangleEdge domainAxisEdge = plot.getDomainAxisEdge(); 
    ValueAxis rangeAxis = plot.getRangeAxis(); 
    org.jfree.chart.ui.RectangleEdge rangeAxisEdge = plot.getRangeAxisEdge(); 
    double chartX = domainAxis.java2DToValue(p.getX(), plotArea, 
            domainAxisEdge); 
    double chartY = rangeAxis.java2DToValue(p.getY(), plotArea, 
            rangeAxisEdge); 
    System.out.println("Chart: x = " + chartX + ", y = " + chartY); 
    series2.add(chartX, chartY);
}


@Override
public void chartMouseMoved(ChartMouseEvent cme) 
{     
    if(cme.getTrigger().getButton() ==  MouseEvent.BUTTON1) 
    {

    }
}
}