Почему javaFX circle.getCenterX не работает в этом случае? - PullRequest
0 голосов
/ 29 июня 2018

Прямо сейчас я пытаюсь кодировать простые счеты с JavaFX. На горизонтальных направляющих расположены шарики, расположенные в сетке, и они перемещаются по щелчку мыши из стороны в сторону. Я пытаюсь добавить метки к каждому шару из 10-1, но кажется, что, просто добавляя круги в сетку, им не назначается CenterX / Y. Так как я пытаюсь расположить свой текст, он вообще не появляется. Соответствующая часть моего кода:

    // Stack Gridpane into root pane to organize circles on rails
    GridPane grid = new GridPane();

    // loop to instantiate all circles in a 5x10 grid, add to gridpane
    for (int row = 0; row < 5; row++) {
        for (int count = 10; count > 0; count--) {
            Circle circle = new Circle() ;
            circle.setRadius(20);
            grid.add(circle,count,row);

            // generate Labels and position on circle
            Text label = new Text(Integer.toString(count));
            label.getStyleClass().add("text");
            label.setX(circle.getCenterX());
            label.setY(circle.getCenterY());

            //bind label to circle movement
            label.translateXProperty().bind(circle.translateXProperty());
            root.getChildren().add(label);
        }

    }

    root.getChildren().add(grid);

Когда я добавляю System.out.println (метка), я вижу, что метки генерируются правильно, но координаты всегда остаются в 0/0. Сами круги расположены в сетке так, как они должны. Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 29 июня 2018

Здесь я вижу некоторые проблемы.

Во-первых, setX() и setY() не работают, когда узел находится внутри какого-то подкласса Pane, который управляет макетом для вас. Это связано с тем, что менеджер компоновки переопределяет это значение при попытке разметки дочерних элементов.

Во-вторых, вы добавляете метку к корневому узлу, в результате чего все Text собираются в одном месте.

Это то, что я бы сделал, используя StackPane, который позволяет вам штабелировать несколько узлов в одном месте. Кроме того, он автоматически центрирует всех своих детей.

// Stack Gridpane into root pane to organize circles on rails
GridPane grid = new GridPane();

// loop to instantiate all circles in a 5x10 grid, add to gridpane
for (int row = 0; row < 5; row++) {
    for (int count = 10; count > 0; count--) {
        StackPane sp = new StackPane();
        grid.add(sp, count, row);

        Circle circle = new Circle();
        circle.setRadius(20);

        // generate Labels and position on circle
        Text label = new Text(Integer.toString(count));
        label.getStyleClass().add("text");
        label.setFill(Color.RED); // Added so it's visible

        // Don't need these
        //label.setX(circle.getCenterX());
        //label.setY(circle.getCenterY());

        //bind label to circle movement
        //label.translateXProperty().bind(circle.translateXProperty());
        //root.getChildren().add(label);

        // Add circle and label to StackPane so it'll handle layout for you
        sp.getChildren().addAll(circle, label);
    }
}
root.getChildren().add(grid);

Из того, что я вижу, у вас есть перевод. Это было бы немного сложно, в зависимости от того, что именно вам нужно.

...