Как получить границы узла в соответствии с его конкретным предком в JavaFX 8? - PullRequest
0 голосов
/ 18 октября 2018

Я добавил диаграмму в 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();
    }
}

enter image description here

Так чтоВопрос в том, как получить границы узла или диаграммы в моем случае в соответствии с его предком, независимо от того, сколько их там?

1 Ответ

0 голосов
/ 18 октября 2018

Вы уже нашли фоновый узел Chart-Plot, и чтобы получить его координаты в соответствии с его предком, вам нужно просто позвонить

chartPlotArea.getBoundsInParent();

, и если между ними более одного предка, вы можете получитьпостроить границы в системе координат AnchorPane, как эта

Bounds bounds =
            anchorPane.sceneToLocal(chartPlotArea.localToScene(chartPlotArea.getBoundsInLocal()));

Небольшая хитрость здесь в том, что они будут равны 0, пока вы не покажете stage и не разрешите узлы макета javaFX, поэтому вам нужно обновить его методом afte .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);

И помните, что если вы хотите изменить координаты при изменении размера, вы можете привязать это к изменениям диаграммы или диаграммыPlotArea / ширины, что-то вроде

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

, это будет работать, даже если между ними более одного предка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...