Получение центра круга с использованием привязки свойств Javafx

Как я могу найти центр круга после привязки его к панели?

circle.centerXProperty().bind(pane.widthProperty().divide(2));
circle.centerYProperty().bind(pane.heightProperty().divide(2));

Я использовал приведенный выше код для привязки свойств круга. Однако, если я хочу получить координаты X и Y центра, их значения равны 0.00.

Я использовал circle.getCenterX(); и circle.centerXProperty().

Может ли кто-нибудь помочь мне понять, как получить правильный центр круга?


import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.scene.text.*;
import java.lang.Math;

public class CharactersAroundCircle extends Application {


    public void start(Stage primaryStage){

        String str = "Welcome To Java";
        Circle circle = new Circle();
        System.out.println(str.length());
        Pane pane = new Pane();
        circle.setRadius(125);
        circle.centerXProperty().bind(pane.widthProperty().divide(2));
        circle.centerYProperty().bind(pane.heightProperty().divide(2));

        circle.setStroke(Color.BLACK);
        circle.setFill(new Color(1,1,1,0));


            Text text = new Text();
            text.setText(String.valueOf(str.charAt(0)));
            text.setStroke(Color.BLACK);
            text.setFont(Font.font("Times New Roman", 20));
            // text.setX(circle.getCenterX() + Math.toRadians(Math.sin(360 / str.length()) * circle.getRadius()));
            // text.setY(circle.getCenterY() + Math.toRadians(Math.cos(360 / str.length()) * circle.getRadius()));
            text.setX(circle.getCenterX() + 100);
            text.setY(circle.getCenterY() + 100);
            System.out.println(circle.centerXProperty());
            System.out.println(circle.getCenterY());
            pane.getChildren().add(text);


        pane.getChildren().add(circle);

        Scene scene = new Scene(pane, 300, 300);
        primaryStage.setTitle("CharactersAroundCircle");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}


person Omar Jarkas    schedule 16.01.2020    source источник
comment
Какие значения вы ожидаете и какие значения вы получаете?   -  person Polygnome    schedule 16.01.2020
comment
Фактический вывод выглядит как 0.00, но вы правы, @Polygnome, нам нужны и ожидаемые значения.   -  person deHaar    schedule 16.01.2020
comment
Кроме того, вы никогда не добавляете в сцену панель, содержащую круг. Таким образом, панель не имеет ширины или высоты, поэтому центр круга равен 0/0.   -  person Polygnome    schedule 16.01.2020
comment
System.out.println(circle.centerXProperty()); System.out.println(circle.getCenterY()); должен печатать ожидаемые значения после primaryStage.show();   -  person c0der    schedule 16.01.2020


Ответы (1)


Ваша проблема в том, что вы не обращаетесь к значениям кругов динамически. Вы можете решить эту проблему, используя привязки (например, с помощью pane.heightProperty) или используя ChangeListener:

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class CharactersAroundCircle extends Application implements ChangeListener<Number> {
    Circle circle;
    Text text;
    String str;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        str = "Welcome To Java";
        circle = new Circle();
        System.out.println(str.length());
        Pane pane = new Pane();
        circle.setRadius(125);
        circle.centerXProperty().bind(pane.widthProperty().divide(2));
        circle.centerYProperty().bind(pane.heightProperty().divide(2));
        pane.widthProperty().addListener(this);
        pane.heightProperty().addListener(this);

        circle.setStroke(Color.BLACK);
        circle.setFill(new Color(1, 1, 1, 0));

        text = new Text();
        text.setText(String.valueOf(str.charAt(0)));
        text.setStroke(Color.BLACK);
        text.setFont(Font.font("Times New Roman", 20));
        pane.getChildren().add(text);

        pane.getChildren().add(circle);

        Scene scene = new Scene(pane, 300, 300);
        primaryStage.setTitle("CharactersAroundCircle");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    @Override
    public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
        text.setX(circle.getCenterX() + Math.toRadians(Math.sin(360 / str.length()) * circle.getRadius()));
        text.setY(circle.getCenterY() + Math.toRadians(Math.cos(360 / str.length()) * circle.getRadius()));
    }
}
person Ralf Renz    schedule 16.01.2020