JavaFX从折线图获取坐标x、y点

JavaFX从折线图获取坐标x、y点,java,charts,javafx,linechart,Java,Charts,Javafx,Linechart,我对折线图有些问题。我的代码: package test; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.chart.Chart; import javafx.scene.chart.LineChart; import javafx.sc

我对折线图有些问题。我的代码:

package test;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.chart.Chart;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Path;
import javafx.scene.shape.Shape;
import javafx.stage.Stage;

public class SampleLineChart extends Application {
    public LineChart<Number, Number> lineChart;
    public Button button = new Button();
    public XYChart.Series series;

    @Override public void start(Stage stage) {
        stage.setTitle("Line Chart Sample");
        // defining the axes
        final NumberAxis xAxis = new NumberAxis();
        final NumberAxis yAxis = new NumberAxis();
        xAxis.setLabel("Number of Month");
        // creating the chart
        lineChart = new LineChart<Number, Number>(xAxis, yAxis);

        lineChart.setTitle("Stock Monitoring, 2010");
        // defining a series
        series = new XYChart.Series();
        series.setName("My portfolio");
        // populating the series with data
        series.getData().add(new XYChart.Data<Integer, Integer>(1, 23));
        series.getData().add(new XYChart.Data<Integer, Integer>(2, 14));
        series.getData().add(new XYChart.Data<Integer, Integer>(3, 15));
        series.getData().add(new XYChart.Data<Integer, Integer>(4, 24));
        series.getData().add(new XYChart.Data<Integer, Integer>(5, 34));
        series.getData().add(new XYChart.Data<Integer, Integer>(6, 36));
        series.getData().add(new XYChart.Data<Integer, Integer>(7, 22));
        series.getData().add(new XYChart.Data<Integer, Integer>(8, 45));
        series.getData().add(new XYChart.Data<Integer, Integer>(9, 43));
        series.getData().add(new XYChart.Data<Integer, Integer>(10, 17));
        series.getData().add(new XYChart.Data<Integer, Integer>(11, 29));
        series.getData().add(new XYChart.Data<Integer, Integer>(12, 25));
        lineChart.setCreateSymbols(false);
        Pane pane = new Pane();
        HBox hbox = new HBox();
        hbox.getChildren().add(lineChart);
        button = new Button("Naciśnij");
        hbox.getChildren().add(button);
        button.setOnAction(new EventHandler<ActionEvent>() {

            public void handle(ActionEvent arg0) {
                System.out.println("Get cords");


            }
        });
        pane.getChildren().add(hbox);

        Scene scene = new Scene(pane, 800, 600);
        lineChart.getData().add(series);
        Shape shape = lineChart.getShape();

        stage.setScene(scene);
        stage.show();

    }

    public static void main(String[] args) {
        launch(args);
    }
}
封装测试;
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.chart.chart;
导入javafx.scene.chart.LineChart;
导入javafx.scene.chart.NumberAxis;
导入javafx.scene.chart.XYChart;
导入javafx.scene.control.Button;
导入javafx.scene.layout.HBox;
导入javafx.scene.layout.Pane;
导入javafx.scene.shape.Path;
导入javafx.scene.shape.shape;
导入javafx.stage.stage;
公共类SampleLineChart扩展了应用程序{
公共线形图;
公共按钮按钮=新按钮();
公共图表系列;
@覆盖公共无效开始(阶段){
阶段。设置标题(“折线图样本”);
//定义轴
最终数字axis xAxis=新数字axis();
最终数字axis yAxis=新数字axis();
xAxis.setLabel(“月数”);
//创建图表
线形图=新线形图(xAxis,yAxis);
线形图.setTitle(“库存监控,2010年”);
//定义系列
series=新的XYChart.series();
series.setName(“我的投资组合”);
//用数据填充序列
series.getData().add(新的XYChart.Data(1,23));
series.getData().add(新的XYChart.Data(2,14));
series.getData().add(新的XYChart.Data(3,15));
series.getData().add(新的XYChart.Data(4,24));
series.getData().add(新的XYChart.Data(5,34));
series.getData().add(新的XYChart.Data(6,36));
series.getData().add(新的XYChart.Data(7,22));
series.getData().add(新的XYChart.Data(8,45));
series.getData().add(新的XYChart.Data(9,43));
series.getData().add(新的XYChart.Data(10,17));
series.getData().add(新的XYChart.Data(11,29));
series.getData().add(新的XYChart.Data(12,25));
lineChart.setCreateSynumbles(false);
窗格=新窗格();
HBox HBox=新的HBox();
hbox.getChildren().add(折线图);
按钮=新按钮(“Naciśnij”);
hbox.getChildren().add(按钮);
setOnAction(新的EventHandler(){
公共无效句柄(ActionEvent arg0){
System.out.println(“获取跳线”);
}
});
pane.getChildren().add(hbox);
场景=新场景(窗格,800600);
lineChart.getData().add(系列);
Shape=lineChart.getShape();
舞台场景;
stage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}
当我点击按钮时,我需要从折线图中获取坐标x,y点。在调试模式下,我可以从lineChart->children->list->backingList->elementData->Chart$1->children->list->backlist->XYChart$1->children->list->backingList->elementData->Path[3]读取坐标。 但我不知道如何编写代码来获取坐标

----我的解决方案----

封装测试;
导入java.util.Random;
导入javafx.application.application;
导入javafx.event.EventHandler;
导入javafx.geometry.Bounds;
导入javafx.scene.Node;
导入javafx.scene.scene;
导入javafx.scene.chart.LineChart;
导入javafx.scene.chart.NumberAxis;
导入javafx.scene.chart.XYChart;
导入javafx.scene.chart.XYChart.Data;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.Pane;
导入javafx.stage.stage;
公共类SampleLineChart扩展了应用程序{
私有XYChart.Series系列=新的XYChart.Series();
私人号码xis yAxis;
私人号码xis xAxis;
私人双Y档;
私人双X档;
窗格玻璃;
私有空间坐标(){
int指数=0;
for(数据值:series.getData()){
System.out.println(“Coord#”+索引);
double x=xShift+xAxis.getDisplayPosition(value.getXValue().doubleValue());
双y=yShift+yAxis.getDisplayPosition(value.getYValue().doubleValue());
系统输出println(x);
系统输出打印项次(y);
索引++;
}
}
@覆盖公共无效开始(阶段){
折线图=新折线图(xAxis=新数字axis(0,100,10),yAxis=新数字axis(0,100,10));
series.getData().add(新的XYChart.Data(0,0));
series.getData().add(新的XYChart.Data(1,2));
series.getData().add(新的XYChart.Data(2,14));
series.getData().add(新的XYChart.Data(4,18));
series.getData().add(新的XYChart.Data(10,20));
chart.getData().addAll(系列);
窗格=新窗格();
pane.getChildren().addAll(图表);
场景=新场景(窗格);
//在鼠标上添加新值单击以进行测试
setOnMouseClicked(新的EventHandler(){
@重写公共无效句柄(MouseEvent t){
series.getData().add(新的XYChart.Data(series.getData().size()*10,30+50*新的Random().nextDouble());
Coords();
}
});
舞台场景;
stage.show();
//查找图表区域节点
节点chartArea=chart.lookup(“.chart-plot-background”);
Bounds chartAreaBounds=chartArea.localToScene(chartArea.getBoundsInLocal());
//记住图表区域的场景位置
yShift=chartAreaBounds.getMinY();
xShift=chartAreaBounds.getMinX();
//将valueMarker的x参数设置为图表区域边界
Coords();
}
公共静态void main(字符串[]args){
发射();
}
}

我不太清楚你所说的坐标是什么意思。什么的坐标相对于什么?e、 g.图表数据值,如1,23?还是相对于屏幕顶部的像素坐标?或者本地的图表绘制区域?等等。也许这个问题可以帮助你:或者也许谢谢你,我解决了我的问题
package test;

import java.util.Random;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Bounds;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class SampleLineChart extends Application {


    private XYChart.Series<Number, Number> series = new XYChart.Series<>();
    private NumberAxis yAxis;
    private NumberAxis xAxis;
    private double yShift;
    private double xShift;
    Pane pane;
    private void Coords() {
        int index = 0;
        for (Data<Number, Number> value : series.getData()) {
            System.out.println("Coord #" + index);
            double x=xShift + xAxis.getDisplayPosition(value.getXValue().doubleValue());
            double y=yShift + yAxis.getDisplayPosition(value.getYValue().doubleValue());
            System.out.println(x);
            System.out.println(y);
            index++;
        }
    }

    @Override public void start(Stage stage) {
        LineChart<Number, Number> chart = new LineChart<>(xAxis = new NumberAxis(0, 100, 10), yAxis = new NumberAxis(0, 100, 10));

        series.getData().add(new XYChart.Data(0, 0));
        series.getData().add(new XYChart.Data(1, 2));
        series.getData().add(new XYChart.Data(2, 14));
        series.getData().add(new XYChart.Data(4, 18));
        series.getData().add(new XYChart.Data(10, 20));

        chart.getData().addAll(series);
        pane = new Pane();
        pane.getChildren().addAll(chart);
        Scene scene = new Scene(pane);

        // add new value on mouseclick for testing
        chart.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override public void handle(MouseEvent t) {
                series.getData().add(new XYChart.Data(series.getData().size() * 10, 30 + 50 * new Random().nextDouble()));
                Coords();
            }
        });

        stage.setScene(scene);
        stage.show();

        // find chart area Node
        Node chartArea = chart.lookup(".chart-plot-background");
        Bounds chartAreaBounds = chartArea.localToScene(chartArea.getBoundsInLocal());
        // remember scene position of chart area
        yShift = chartAreaBounds.getMinY();
        xShift = chartAreaBounds.getMinX();
        // set x parameters of the valueMarker to chart area bounds
        Coords();
    }

    public static void main(String[] args) {
        launch();
    }
}