如何在图表空间中获取鼠标位置

时间:2015-02-17 13:03:50

标签: javafx javafx-8

如何在图表空间坐标中获取XYChart<Number,Number>上的鼠标位置?

以下是我尝试使用NumberAxis.getValueForDisplay()的示例:

public class Test extends Application {

@Override
public void start(Stage primaryStage) {

    Axis<Number> xAxis = new NumberAxis();
    Axis<Number> yAxis = new NumberAxis();
    XYChart<Number,Number> chart = new AreaChart<>(xAxis,yAxis);

    Pane root = new AnchorPane();
    root.getChildren().add(chart);

    Scene scene = new Scene(root);
    primaryStage.setScene(scene);

    chart.setOnMousePressed((MouseEvent event) -> {
        primaryStage.setTitle("" +
            xAxis.getValueForDisplay(event.getX()) + ",  " +
            yAxis.getValueForDisplay(event.getY())
        );
    });

    primaryStage.show();
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

}

但是当我运行它时,我得到的坐标的偏移误差约为10.6,-4.8。

1 个答案:

答案 0 :(得分:3)

您正在向x方法提供相对于图表的ygetValueForDisplay(...)坐标。您需要相对于实际轴的坐标。 (xAxis将偏离图表的边缘,以允许yAxis的水平空间,以及可能的其他填充,反之亦然。)

为此,获取相对于场景的鼠标事件的坐标,并将它们转换为轴的坐标系:

chart.setOnMousePressed((MouseEvent event) -> {

    Point2D mouseSceneCoords = new Point2D(event.getSceneX(), event.getSceneY());
    double x = xAxis.sceneToLocal(mouseSceneCoords).getX();
    double y = yAxis.sceneToLocal(mouseSceneCoords).getY();

    primaryStage.setTitle("" +
        xAxis.getValueForDisplay(x) + ",  " +
        yAxis.getValueForDisplay(y)
    );
});