Do not do this by scaling, use the MouseListener added to the ChartPanel to add the Marker axis to the Domain axis.
In this example, I have subclassed the MouseAdapter so that when you click on the mouse, the domain value is captured ( markerStart ), and when you release the update for the end of the mouse, it is updated ("markerEnd") and the marker is added to the graph ( updateMarker )
Then you will get the chart as follows:

Note that in this example, I actually turned off scaling.
import java.awt.Color; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import javax.swing.JFrame; import javax.swing.JPanel; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.IntervalMarker; import org.jfree.chart.plot.Marker; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.data.xy.XYDataset; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; import org.jfree.ui.Layer; public class MouseMarkerDemo extends JFrame { public MouseMarkerDemo(String title) { super(title); JPanel chartPanel = createDemoPanel(); chartPanel.setPreferredSize(new java.awt.Dimension(500, 270)); setContentPane(chartPanel); } private final static class MouseMarker extends MouseAdapter{ private Marker marker; private Double markerStart = Double.NaN; private Double markerEnd = Double.NaN; private final XYPlot plot; private final JFreeChart chart; private final ChartPanel panel; public MouseMarker(ChartPanel panel) { this.panel = panel; this.chart = panel.getChart(); this.plot = (XYPlot) chart.getPlot(); } private void updateMarker(){ if (marker != null){ plot.removeDomainMarker(marker,Layer.BACKGROUND); } if (!( markerStart.isNaN() && markerEnd.isNaN())){ if ( markerEnd > markerStart){ marker = new IntervalMarker(markerStart, markerEnd); marker.setPaint(new Color(0xDD, 0xFF, 0xDD, 0x80)); marker.setAlpha(0.5f); plot.addDomainMarker(marker,Layer.BACKGROUND); } } } private Double getPosition(MouseEvent e){ Point2D p = panel.translateScreenToJava2D( e.getPoint()); Rectangle2D plotArea = panel.getScreenDataArea(); XYPlot plot = (XYPlot) chart.getPlot(); return plot.getDomainAxis().java2DToValue(p.getX(), plotArea, plot.getDomainAxisEdge()); } @Override public void mouseReleased(MouseEvent e) { markerEnd = getPosition(e); updateMarker(); } @Override public void mousePressed(MouseEvent e) { markerStart = getPosition(e); } } private static XYDataset createDataset() { XYSeries series1 = new XYSeries("Data"); 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); XYSeriesCollection dataset = new XYSeriesCollection(); dataset.addSeries(series1); return dataset; } private static JFreeChart createChart(XYDataset dataset) { JFreeChart chart = ChartFactory.createXYLineChart( "Mouse Marker", "X", "Y", dataset, PlotOrientation.VERTICAL, true, true, false ); XYPlot plot = (XYPlot) chart.getPlot(); plot.setDomainPannable(true); plot.setRangePannable(true); XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer(); renderer.setBaseShapesVisible(true); renderer.setBaseShapesFilled(true); return chart; } public static JPanel createDemoPanel() { final JFreeChart chart = createChart(createDataset()); final ChartPanel panel = new ChartPanel(chart); panel.setRangeZoomable(false); panel.setDomainZoomable(false); panel.addMouseListener(new MouseMarker(panel)); return panel; } public static void main(String[] args) { MouseMarkerDemo demo = new MouseMarkerDemo("JFreeChart: MouseMarkerDemo.java"); demo.pack(); demo.setVisible(true); } }
Grahama
source share