user14683403
user14683403

Reputation:

How to move an existing Line shape in java using a mouse?

I would like to drag a selected line, but I'm unsure how to do it. I tried the following but it doesn't work and the line doesn't move correctly. What calculations am I missing?

var deltaX = mouseEvent.x - (line.startX + line.endX)
var deltaY = mouseEvent.y - (line.startY + line.endY)
line.startX  = line.startX + deltaX
line.startY  = line.startY +deltaY
line.endX = line.endX + deltaX
line.endY = line.endY +deltaY

Upvotes: 0

Views: 263

Answers (3)

Giovanni Contreras
Giovanni Contreras

Reputation: 2547

moving line javafx

moving line with mouse

moving a line using mouse event

App.java

    public class App extends Application {

    private double startX;
    private double startY;

    @Override
    public void start(Stage stage) throws Exception {
        Line line = new Line(0, 0, 0, 200);
        line.setStrokeWidth(8);
        Shape endHandler = new Circle(15, Color.BLUE);

        endHandler.setStroke(Color.BLACK);

        line.setOnMousePressed(e -> {

            startX = line.getLayoutX() - e.getX();
            startY = line.getLayoutY() - e.getY();

        });

        line.setOnMouseDragged(e -> {
            line.setTranslateX(line.getTranslateX() + e.getX()+startX);
            line.setTranslateY(line.getTranslateY() + e.getY()+startY);

        });

        Group group = new Group(line);
        group.setTranslateX(250);
        group.setTranslateY(250);

        Scene scene = new Scene(new AnchorPane(group), 500, 500);

        stage.setTitle("moving line");

        stage.setScene(scene);
        stage.show();
    }
}

Upvotes: 4

Giovanni Contreras
Giovanni Contreras

Reputation: 2547

moving by binding start x y and end x y

moving line

In this aproach we are dragging circle shapes and the start and the end of line object will follow those shapes 'cause they are binded This is a functional single javafx app you can try . red circle is for start line position and blue is for end

public class App extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Line line = new Line(0, 0, 0, 200);
        Shape endHandler = new Circle(15, Color.BLUE);

        endHandler.setStroke(Color.BLACK);

        Shape startHandler = new Circle(15, Color.RED);

        startHandler.setStroke(Color.BLACK);

        endHandler.translateXProperty().bindBidirectional(line.endXProperty());
        endHandler.translateYProperty().bindBidirectional(line.endYProperty());

        startHandler.translateXProperty().bindBidirectional(line.startXProperty());
        startHandler.translateYProperty().bindBidirectional(line.startYProperty());

        endHandler.setOnMouseDragged(e -> {
            endHandler.setTranslateX(endHandler.getTranslateX() + e.getX());
            endHandler.setTranslateY(endHandler.getTranslateY() + e.getY());

        });
        startHandler.setOnMouseDragged(e -> {
            startHandler.setTranslateX(startHandler.getTranslateX() + e.getX());
            startHandler.setTranslateY(startHandler.getTranslateY() + e.getY());

        });

        Group group = new Group(line, endHandler, startHandler);
        group.setTranslateX(250);
        group.setTranslateY(250);

        Scene scene = new Scene(new AnchorPane(group), 500, 500);

        stage.setTitle("moving line");

        stage.setScene(scene);
        stage.show();
    }
}

Upvotes: 3

LearningJava
LearningJava

Reputation: 55

This code cancels out the start / end position. for

line.startX  = line.startX + deltaX
=
line.startX  = line.startX +(mouseEvent.x - (line.startX + line.endX))
= 
line.startX  = -line.endX+mouseEvent.x

So now you dont even have the start position

You should have

var deltaX=mouseEvent.x
var deltaY = mouseEvent.y
line.startX  = line.startX + deltaX
line.startY  = line.startY +deltaY
line.endX = line.endX + deltaX
line.endY = line.endX +deltaY

Make sure the mouse Positions update

Upvotes: 0

Related Questions