您已经找到了Chart-Plot背景节点,并根据其祖先需要简单地调用它来获取坐标
chartPlotArea.getBoundsInParent();
如果它们之间有多个祖先,你可以获得char-plot界限
在AnchorPane这样的坐标系中
Bounds bounds =
anchorPane.sceneToLocal(chartPlotArea.localToScene(chartPlotArea.getBoundsInLocal()));
这里的一个小技巧是,它们将为0,直到你显示阶段并让javaFX布局节点,所以你需要在.show()方法后更新它,所以结果可能如下所示:
NumberAxis numberAxis = new NumberAxis();
LineChart chart = new LineChart(numberAxis,new NumberAxis());
chart.getYAxis().setSide(Side.RIGHT);
Node chartPlotArea = chart.lookup(".chart-plot-background");
chartPlotArea.setStyle("-fx-background-color: cyan");
Text text = new Text();
text.setText("Text");
AnchorPane anchorPane = new AnchorPane();
AnchorPane.setTopAnchor(chart,0.0);
AnchorPane.setRightAnchor(chart,0.0);
AnchorPane.setBottomAnchor(chart,0.0);
AnchorPane.setLeftAnchor(chart,0.0);
anchorPane.getChildren().addAll(chart,text);
Scene scene = new Scene(anchorPane);
primaryStage.setScene(scene);
primaryStage.setMaximized(true);
primaryStage.show();
Bounds bounds =
anchorPane.sceneToLocal(chartPlotArea.localToScene(chartPlotArea.getBoundsInLocal()));
double textRelativeX = (bounds.getMinX() + bounds.getMaxX()) / 2 - text.getLayoutBounds().getWidth() / 2;
double textRelativeY = bounds.getMinY() - text.getLayoutBounds().getHeight() / 2;
AnchorPane.setLeftAnchor(text,textRelativeX);
AnchorPane.setTopAnchor(text,textRelativeY);
请记住,如果您想在调整大小时更改坐标,可以将其绑定到图表或chartPlotArea绑定/宽度更改,这样的事情
chart.layoutBoundsProperty().addListener((observable,oldValue,newValue) -> {
double textRelativeXz = (newValue.getMinX() + newValue.getMaxX()) / 2 - text.getLayoutBounds().getWidth() / 2;
double textRelativeYz = newValue.getMinY() - text.getLayoutBounds().getHeight() / 3;
AnchorPane.setLeftAnchor(text,textRelativeXz);
AnchorPane.setTopAnchor(text,textRelativeYz);
});
编辑:如果你有一个以上的祖先,你可以这样做,以接收anchorPane坐标系中的char-plot界限
Bounds bounds =
anchorPane.sceneToLocal(chartPlotArea.localToScene(chartPlotArea.getBoundsInLocal()));
即使它们之间存在多个祖先,这也会起作用