JavaFX |изменение якоря линии? - PullRequest
0 голосов
/ 16 марта 2019

Я пытался нарисовать линию и изменить ее конечную координату при перетаскивании.Проблема в том, что он меняет оба конца линий относительно середины, предположительно якоря.

Есть ли способ переместить якорь к началу линии?

Мой код:

        Line path = new Line(30,30, 70 , 75);
        path.setStrokeWidth(5);

        Circle point = new Circle(3);
        point.setCenterX(path.getEndX());
        point.setCenterY(path.getEndY());
        point.setFill(Paint.valueOf("red"));

        point.setOnMouseDragged(e ->{

            point.setCenterX(e.getX());
            point.setCenterY(e.getY());

            path.setEndX(point.getCenterX());
            path.setEndY(point.getCenterY());

        });

        Group shapes = new Group();
        shapes.getChildren().addAll(path, point);
        BorderPane root = new BorderPane(shapes);
        Scene scene = new Scene(root,600,400);
        scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());


        primaryStage.setScene(scene);



        primaryStage.show();

результат:

enter image description here
В идеале точка поворота будет наначало строки, а не в середине.

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

То, что вы видите, - это не линия, растущая или сужающаяся в обоих направлениях; вместо этого, когда линия меняет длину, BorderPane перемещает ее, чтобы сохранить ее по центру. То же самое происходит с «вращением». При перемещении конца таким образом, чтобы изменить угол линии, ограничивающий прямоугольник изменяется таким образом, что, когда BorderPane перемещает линию, заставляет другой конец двигаться в противоположном направлении.

Точнее говоря, BorderPane перемещает Group - фактически то же самое, поскольку Group не позиционирует своих потомков. Одно из решений этой проблемы - сделать Group неуправляемым. Это остановит BorderPane от изменения положения Group при изменении его границ. Обратите внимание, однако, что это также остановит Group от участия в расчете размера и компоновки BorderPane.

Вот пример:

import javafx.application.Application;
import javafx.geometry.Point2D;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.stage.Stage;

public class Main extends Application {

    private static void installDragHandlers(Circle circle) {
        circle.setOnMousePressed(event -> {
            Point2D offset = new Point2D(
                    event.getX() - circle.getCenterX(),
                    event.getY() - circle.getCenterY()
            );
            circle.setUserData(offset);
            event.consume();
        });
        circle.setOnMouseDragged(event -> {
            Point2D offset = (Point2D) circle.getUserData();
            circle.setCenterX(event.getX() - offset.getX());
            circle.setCenterY(event.getY() - offset.getY());
            event.consume();
        });
        circle.setOnMouseReleased(event -> {
            circle.setUserData(null);
            event.consume();
        });
    }

    @Override
    public void start(Stage primaryStage) {
        Line line = new Line(200, 200, 400, 200);
        line.setStrokeWidth(2);

        Circle start = new Circle(5, Color.GREEN);
        start.centerXProperty().bindBidirectional(line.startXProperty());
        start.centerYProperty().bindBidirectional(line.startYProperty());
        installDragHandlers(start);

        Circle end = new Circle(5, Color.RED);
        end.centerXProperty().bindBidirectional(line.endXProperty());
        end.centerYProperty().bindBidirectional(line.endYProperty());
        installDragHandlers(end);

        Group group = new Group(line, start, end);
        group.setManaged(false);

        primaryStage.setScene(new Scene(new BorderPane(group), 600, 400));
        primaryStage.setTitle("SO-55196882");
        primaryStage.show();
    }

}

Line инициализируется с жестко закодированными начальной и конечной точками, так что он изначально центрируется в сцене (чьи начальные размеры также жестко закодированы).

0 голосов
/ 16 марта 2019

Поместите фигуры в группу.

public void start(final Stage primaryStage) throws AWTException {
    final Line path = new Line(30, 30, 70, 75);
    path.setStrokeWidth(5);

    final Circle point = new Circle(3);
    point.setCenterX(path.getEndX());
    point.setCenterY(path.getEndY());
    point.setFill(Paint.valueOf("red"));

    point.setOnMouseDragged(e -> {

        point.setCenterX(e.getX());
        point.setCenterY(e.getY());

        path.setEndX(point.getCenterX());
        path.setEndY(point.getCenterY());

    });

    final Group root = new Group(path, point);
    primaryStage.setScene(new Scene(root));
    primaryStage.show();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...