Search code examples
jfreechart

How to draw a linechart on click in JFreeChart?


I am able to draw LineChart using JFreeChart. I would like to know how to draw linechart with legends. The place where I click should be dynamaically updated in the JFreeChart.

I have mentioned a image here to explain what I Mean. In the Image I am able draw the black line what I want is the red line to be drawn on click. Can anybody suggest me something related to this?

Thanks in advance

enter image description here


Solution

  • Here is the sample code. In this I have 3 Series. and I am adding onclick datapoints to second series.

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