2016-12-01 129 views
1

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

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(); 

} 

回答

1

您忽略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(); 
}); 
+0

这很好用,谢谢!我正在尝试了解Transitions和类似的东西。这是一个巨大的帮助。 – theAnon

0

这里完整的示例:然而在这种情况下,它应该也有一些小的调整工作。

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); 
    } 
} 
+0

很酷谢谢你。实际上,我在2013年发布的GitHub页面上引用了一个项目,您可以通过按箭头键,单击鼠标或按住Ctrl并单击鼠标来显示如何过渡圆。在帮助我学习Transitions和东西方面已经非常努力,所以谢谢你,我非常感谢你做到了这一点。 – theAnon

相关问题