То, что вы видите, - это не линия, растущая или сужающаяся в обоих направлениях; вместо этого, когда линия меняет длину, 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
инициализируется с жестко закодированными начальной и конечной точками, так что он изначально центрируется в сцене (чьи начальные размеры также жестко закодированы).