将矩形移动到鼠标点击发生的位置

Moving a Rectangle to the position where a mouse click happen

我正在尝试创建一个项目,用户在屏幕上单击,然后一个矩形将移动到单击发生的位置。我的目的是让矩形的中心移动点击的确切位置,但我的代码只将矩形移动到点击发生的一般区域。我的问题是如何让矩形的中心移动到发生鼠标单击的确切位置?

public void start(Stage primaryStage) {

    BorderPane root = new BorderPane();
    Scene scene = new Scene(root,400,400);

    Rectangle rec = new Rectangle(50,50,50,50);
    rec.setLayoutX(200);
    rec.setLayoutY(200);

    TranslateTransition transition = new TranslateTransition(Duration.seconds(0.50), rec);
    transition.setOnFinished(new EventHandler<ActionEvent>() {
        @Override public void handle(ActionEvent t) {
            rec.setLayoutX(rec.getTranslateX() + rec.getLayoutX());
            rec.setLayoutY(rec.getTranslateY() + rec.getLayoutY());
            rec.setTranslateX(0);
            rec.setTranslateY(0);
        }
    });

    scene.setOnMousePressed(e->{
        transition.setToX(e.getSceneX() - rec.getLayoutX());
        transition.setToY(e.getSceneY() - rec.getLayoutY());
        transition.playFromStart();
    });

    root.getChildren().add(rec);

    primaryStage.setScene(scene);
    primaryStage.show();

}

您忽略了 Rectanglex/y 属性,这也会移动绘制 Rectangle 的位置。此外,要将中心移动到此位置,还需要从要移动到的位置减去 width/height 的一半...

另外,我建议使用 Pane 而不是 BorderPane,你想自己设置 layoutX/layoutY 属性吗?尽管如此,在这种情况下,它应该也可以通过一些小的调整来工作:

scene.setOnMousePressed(e -> {
    transition.setToX(e.getSceneX() - rec.getLayoutX() - rec.getWidth() / 2 - rec.getX());
    transition.setToY(e.getSceneY() - rec.getLayoutY() - rec.getHeight() / 2 - rec.getY());
    transition.playFromStart();
});

这里是 fabian 建议的使用 Pane 的完整示例。

import javafx.animation.TranslateTransition;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Translator extends Application {
    private static final double W = 400, H = 400;
    private static final double S = 50;

    public void start(Stage stage) {
        Rectangle rec = new Rectangle(W / 2 - S / 2,H / 2 - S / 2,S,S);

        TranslateTransition transition = new TranslateTransition(Duration.millis(500), rec);
        transition.setOnFinished(t -> {
            rec.setX(rec.getTranslateX() + rec.getX());
            rec.setY(rec.getTranslateY() + rec.getY());
            rec.setTranslateX(0);
            rec.setTranslateY(0);
        });

        Pane root = new Pane(rec);
        Scene scene = new Scene(root,W,H);

        root.setOnMousePressed(e -> {
            transition.stop();
            transition.setToX(e.getX() - S / 2 - rec.getX());
            transition.setToY(e.getY() - S / 2 - rec.getY());
            transition.playFromStart();
        });

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

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