Como llegar a los límites de nodos según su ancestro específico en JavaFX 8?

Velaniv Jr:

He añadido un gráfico en AnchorPane, y quiero obtener los límites de su parcela (diagrama de parcelas, he marcado con el color cian) , por lo que podría añadir algunos textos en la parte superior de la misma, pero debe conocer su exacta límites de acuerdo con su ancestro (s). Si lo hago manualmente, puedo fallar cuando se cambia el tamaño de los nodos de los rellenos al cambiar el tamaño, etc.

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

introducir descripción de la imagen aquí

Así que la pregunta es cómo conseguir límites de un nodo o un gráfico de parcelas en mi caso en función de su antecesor, no importa cuántas hay?

Alex G.:

Usted ya ha encontrado nodo Gráfico de fondo-Plot, y para obtener las coordenadas que de acuerdo a su antecesor es necesario simplemente llamada

chartPlotArea.getBoundsInParent();

y si hay más de un ancestro entre ellos se puede obtener límites char-trama en el sistema de coordenadas AnchorPane como esto

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

Un pequeño truco aquí, es que va a ser 0s hasta que se muestre el escenario y dejar que los nodos de diseño JavaFX, por lo que necesita para actualizarlo faet .show()método, por lo resultado puede tener este aspecto:

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

Y recuerda, que si se quiere cambiar las coordenadas al cambiar el tamaño puede enlazar esto a trazar o chartPlotArea obligado / ancho de cambios, algo como esto

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

EDIT: si tiene más de un ancestro que puede hacer como esto para recibir los límites char-trama en anchorPane sistema de coordenadas

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

esto funcionará incluso si hay más de un ancestro entre ellas

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=171409&siteId=1
Recomendado
Clasificación