У меня проблема с рисованием креста с помощью JavaFX - PullRequest
4 голосов
/ 13 апреля 2019

Я пытаюсь написать код, который будет рисовать 3 фигуры по диагонали по сетке. Первые две фигуры - это квадрат и круг, что я смог сделать.

Третья фигура, однако, вызывает у меня некоторое горе. Я должен нарисовать крест (версия T, а не X), и каждый раз, когда я выписываю код, он выглядит как боком, ⊢. Я знаю, что мне не хватает чего-то простого, но я был бы очень признателен за помощь!

Вот полный код моей программы Shapes.

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.scene.paint.Color;

public class Shapes extends Application {

    public void start(Stage primaryStage) {
        // This will build the shapes which include a Square, Circle, and 2 Lines.
        // All shapes will have a width of 3.

        // This Rectangle will be colored like the Square on a playstation controller
        Rectangle square = new Rectangle(65, 65, 65, 65);
        square.setStroke(Color.rgb(243, 211, 234));
        square.setStrokeWidth(3);
        square.setFill(Color.rgb(243, 211, 234));

        // A circle colored like the Circle on the playstation controller.
        Circle circle = new Circle(40);
        circle.setStroke(Color.rgb(241, 188, 194));
        circle.setStrokeWidth(3);
        circle.setFill(Color.rgb(241, 188, 194));

        // Lines colored like the Cross button on a playstation controller.
        Line line1 = new Line(-50, 75, 50, 75);
        line1.setStroke(Color.rgb(165, 191, 214));
        line1.setStrokeWidth(3);

        Line line2 = new Line(0, 0, 0, 100);
        line2.setStroke(Color.rgb(165, 191, 214));
        line2.setStrokeWidth(3);


        // Setup the GridPane in the center of the stage which will also pad out from the edge of the window.
        GridPane pane = new GridPane();
        pane.setAlignment(Pos.CENTER);
        pane.setPadding(new Insets(11.5, 12.5, 13.5, 14.5));

        // Place each object in it's respective place on the pane.
        // Square top left, Circle, middle, Cross bottom right.
        pane.add(square, 0, 0);
        pane.add(circle, 1, 1);
        pane.add(line1, 2, 2);
        pane.add(line2, 2, 2);

        // Create the scene to display the program.
        Scene scene = new Scene(pane);
        primaryStage.setTitle("Shapes");
        primaryStage.setScene(scene);
        primaryStage.show();
        primaryStage.setResizable(false);
    }

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

А вот конкретный фрагмент, с которым у меня проблемы.

// Lines colored like the Cross button on a playstation controller.
Line line1 = new Line(-50, 75, 50, 75);
line1.setStroke(Color.rgb(165, 191, 214));
line1.setStrokeWidth(3);

Line line2 = new Line(0, 0, 0, 100);
line2.setStroke(Color.rgb(165, 191, 214));
line2.setStrokeWidth(3);

Мне нужно, чтобы горизонтальная линия была немного выше на панели. Он должен напоминать «христианский крест».

Любая помощь очень ценится.

Ответы [ 2 ]

3 голосов
/ 13 апреля 2019

GridPane выравнивает дочерние элементы в ячейках, к которым вы добавляете их.Это приводит к изменению относительного положения Line s.Чтобы это исправить, я рекомендую обернуть Line s в родительский элемент, который не перемещает своих детей, например, Group.

. Следующее изменение приведет к тому, что форма, похожая на «христианский крест», будет повернута на 180 °..

// pane.add(line1, 2, 2);
// pane.add(line2, 2, 2);
pane.add(new Group(line1, line2), 2, 2);
3 голосов
/ 13 апреля 2019

Похоже, геометрия в порядке, но выравнивание line2 неверно. Среди нескольких способов центрировать его,

  1. Установите выравнивание явно для соответствующего GridPane дочернего узла:

    pane.setHalignment(line2, HPos.CENTER);
    
  2. Добавьте строки к Pane, имеющему желаемое расположение; StackPane, например, по умолчанию Pos.CENTER:

    StackPane lines = new StackPane(line1, line2);
    pane.add(lines, 2, 2);
    

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

private static final int N = 50;
…
Rectangle square = new Rectangle(2 * N, 2 * N);
Circle circle = new Circle(N);
Line line1 = new Line(-N, 0, N, 0);
Line line2 = new Line(0, -N, 0, N);

image1

Мне нужно, чтобы горизонтальная линия была немного выше на панели. Оно должно напоминать «христианский крест».

Используя подход , предложенный @fabian, отрегулируйте конечные точки горизонтальной линии по желанию; обратите внимание на изменения для латинского креста, показанные на изображении ниже:

Line line1 = new Line(-N, 0, N, 0); // Greek
Line line1 = new Line(-N, -N/3, N, -N/3); // Latin
…
pane.add(new Group(line1, line2), 2, 2);

image2

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