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();
}
}