为了账号安全,请及时绑定邮箱和手机立即绑定

如何根据JavaFX 8中的特定祖先获取节点边界?

如何根据JavaFX 8中的特定祖先获取节点边界?

肥皂起泡泡 2021-11-24 18:32:37
我在 AnchorPane 中添加了一个图表,我想得到它的图的边界(图表图,我用青色标记了它),这样我就可以在它上面添加一些文本,但我应该知道它的确切信息根据其祖先的界限。如果我手动执行此操作,则在调整大小等时会更改节点的填充大小时,我可能会失败。import javafx.application.Application;import javafx.geometry.Side;import javafx.scene.Node;import javafx.scene.Scene;import javafx.scene.chart.LineChart;import javafx.scene.chart.NumberAxis;import javafx.scene.layout.AnchorPane;import javafx.stage.Stage;public class Main extends Application {    @Override    public void start(Stage primaryStage) throws Exception {        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");        AnchorPane anchorPane = new AnchorPane(chart);        AnchorPane.setTopAnchor(chart, 0.0);        AnchorPane.setRightAnchor(chart, 0.0);        AnchorPane.setBottomAnchor(chart, 0.0);        AnchorPane.setLeftAnchor(chart, 0.0);        Scene scene = new Scene(anchorPane);        primaryStage.setScene(scene);        primaryStage.setMaximized(true);        primaryStage.show();    }}所以问题是如何在我的情况下根据其祖先获得节点或图表图的边界,无论有多少?
查看完整描述

1 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

您已经找到了 Chart-Plot 背景节点,要根据其祖先获取坐标,您只需调用


chartPlotArea.getBoundsInParent();

如果它们之间有多个祖先,您可以像这样在 AnchorPane 坐标系中获得字符图边界


Bounds bounds =

            anchorPane.sceneToLocal(chartPlotArea.localToScene(chartPlotArea.getBoundsInLocal()));

这里的一个小技巧是,在您显示舞台并让 javaFX 布局节点之前,它们将是 0,因此您需要在.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 坐标系中接收字符图边界


     Bounds bounds =

            anchorPane.sceneToLocal(chartPlotArea.localToScene(chartPlotArea.getBoundsInLocal()));   

即使他们之间有不止一个祖先,这也会起作用


查看完整回答
反对 回复 2021-11-24
  • 1 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信