微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

所以问题是如何在我的情况下根据它的祖先获得节点或图表的界限,无论有多少?

解决方法

您已经找到了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()));

即使它们之间存在多个祖先,这也会起作用

原文地址:https://www.jb51.cc/java/128422.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐