NumberAxis.getDisplayPosition(...)返回0

时间:2018-12-11 23:13:48

标签: java javafx

我正在尝试获取LineChart<Number, Number>上某点的x,y,以便可以向其添加Line。因此,我尝试通过以下方式获取x值9:

Group root = new Group(); 
NumberAxis xAxis = new NumberAxis();
xAxis.setAutoRanging(false);
xAxis.setLowerBound(0);
xAxis.setUpperBound(9);
LineChart<Number, Number> lineChart = new LineChart<Number, Number>(xAxis, yAxis);
System.out.println(xAxis.getDisplayPosition(9)); // 0
root.getChildren().add(lineChart);
Scene scene = new Scene(root, 800, 800); 
stage.setScene(scene);
stage.show();

在互联网上闲逛后,我遇到了一个可能的解决方案

Node chartPlotArea = lineChart.lookup(".chart-plot-background");
double chartZeroX = chartPlotArea.getLayoutX();
System.out.println(xAxis.getDisplayPosition(9) + chartZeroX);

哪个最终也输出了0,为什么会这样呢?如何获得x,y的显示位置,以便可以将其传递到Line.setStartX(...) / Line.setStartY(...)中?

2 个答案:

答案 0 :(得分:1)

如果它不是很关键-您不需要在此处以编程方式生成版式传递,则可以让javaFX计算它并在展示阶段后立即进行更新。 在stage.show();

之后移动逻辑

您将获得正确的输出

  stage.show();

  System.out.println(xAxis.getDisplayPosition(9)); 

我已经:443.0

答案 1 :(得分:0)

正如@Alex G.所提到的,在舞台上getDisplayPosition()被叫完之后,我不得不打电话给show。 但是,这不考虑图形的偏移量。因此,我必须像这样使用Bounds

stage.show();
Node chartArea = lineChart.lookup(".chart-plot-background");
Bounds chartAreaBounds = chartArea.localToScene(chartArea.getBoundsInLocal());
int xOffset = chartAreaBounds.getMinX();
System.out.println(xAxis.getDisplayPosition(9) + xOffset); // 324.21428571428567