2016-12-01 11 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

またRectangleが描画される位置を移動Rectanglex/yプロパティを無視します。さらに、この位置に移動するセンターのため、あなたはまたに移動する立場から半分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

これは完璧に動作します、ありがとうございます!私はトランジションとそれに似たものについて学びたいと思っています。これは大きな助けとなりました。 – 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

ありがとうございます。私は実際にあなたがGitHubページであなたが2013年に投稿したプロジェクトを参照しています。矢印キーを押したり、マウスをクリックしたり、Ctrlキーを押しながらマウスをクリックして円を遷移させる方法を示します。トランジションやものについて学ぶのを助けてくれるのは巨大なので、とても感謝しています。 – theAnon

関連する問題