in case of multiple range axis, i not able to map dataset Ordinate value (Y) to related axis range thats why i am not able to Display multiple crosshair with related range axis. it always Display Ordinate value in respect of 0 to 100 y-Axis range. below code is i am using to Display croshhair for multiple range axis.
Code: Select all
@Override
public void chartMouseMoved(ChartMouseEventFX cmefx) {
if (isCrosshaiActive()) {
final Rectangle2D dataArea = chartViewer.getRenderingInfo().getPlotInfo().getDataArea();
final JFreeChart chart = cmefx.getChart();
if (chart.getPlot() instanceof XYPlot) {
final ValueAxis xAxis = ((XYPlot) chart.getPlot()).getDomainAxis();
double x = xAxis.java2DToValue(cmefx.getTrigger().getX(), dataArea, ((XYPlot) chart.getPlot()).getDomainAxisEdge());
//**********************************
//create crosshair for domain axis
//**********************************
final Crosshair domainCrosshair;
final List domainCrosshairs = crosshairOverlay.getDomainCrosshairs();
if (domainCrosshairs.isEmpty()) {
domainCrosshair = new Crosshair(Double.NaN, Color.BLUE, new BasicStroke(0.5f));
domainCrosshair.setVisible(true);
domainCrosshair.setLabelVisible(true);
crosshairOverlay.addDomainCrosshair(domainCrosshair);
} else {
domainCrosshair = (Crosshair) domainCrosshairs.get(0);
}
domainCrosshair.setValue(x);
domainCrosshair.setLabelGenerator(new StandardCrosshairLabelGenerator());
// make the crosshairs disappear if the mouse is out of range
if (!xAxis.getRange().contains(x)) {
x = Double.NaN;
}
//index starts from 0, but index 0 is reserved for default range
//=> index for tags starts therefore from 1
for (int i = 1; i < ((XYPlot) chart.getPlot()).getDatasetCount(); i++) {
if (((XYPlot) chart.getPlot()).getDataset(i) != null) {
double y = DatasetUtilities.findYValue(((XYPlot) chart.getPlot()).getDataset(i), 0, x);
//map dataset ordinate value to related axis range TODO
// ????
//**********************************
//create crosshair for range axis
//**********************************
Crosshair rangeCrosshair;
while(i > crosshairOverlay.getRangeCrosshairs().size()) {
rangeCrosshair = new Crosshair(Double.NaN, Color.BLUE, new BasicStroke(0.5f));
rangeCrosshair.setLabelVisible(true);
rangeCrosshair.setVisible(true);
if (i % 2 != 0) {
rangeCrosshair.setLabelAnchor(RectangleAnchor.TOP_RIGHT);
}
crosshairOverlay.addRangeCrosshair(rangeCrosshair);
}
rangeCrosshair = (Crosshair) crosshairOverlay.getRangeCrosshairs().get(i - 1);
rangeCrosshair.setValue(y);
rangeCrosshair.setLabelGenerator(new StandardCrosshairLabelGenerator());
System.out.println("Crosshair: X="+x+" Y="+y);
}
}
}
}
}
});
}