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

Вы игнорируете свойства в x/y на Rectangle который также сдвигают положение, в котором 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

Это прекрасно работает, спасибо! Я пытаюсь узнать о переходах и подобных вещах. Это была огромная помощь. – 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

Смежные вопросы