2016-04-14 13 views
1

Ich versuche, alle sichtbaren Objekte zu bewegen und zu drehen. Aber nach dem Ziehen und Drehen werden Objekte an ihren alten Orten definiert.Objekte mit der Maus ziehen

Der Mauszeiger ändert sich, wenn er sich über dem Objekt befindet.

Sag mir, was ich falsch mache?

public class Main extends Application { 
    Point2D offset; 
    Shape selected; 

    @Override 
     public void start(Stage primaryStage) { 
     Pane root = new Pane(); 
     Rectangle rect = new Rectangle(40, 20, 50, 100); 
     rect.setRotate(90); 
     Ellipse ellipse = new Ellipse(450, 450, 50, 25); 
     ellipse.setRotate(45); 
     Circle circle = new Circle(250, 250, 50); 
     root.getChildren().addAll(rect, ellipse, circle); 

     root.setOnMousePressed(e-> { 
      offset = new Point2D(e.getX(), e.getY()); 
      e.consume(); 
     }); 

     root.setOnMouseMoved(e-> {  
      for(Node node: root.getChildren()){ 
       if(node.contains(e.getX(), e.getY())){ 
        selected = (Shape) node; 
        root.setCursor(Cursor.HAND); 
        break; 
       }else{ 
        selected = null; 
        root.setCursor(Cursor.DEFAULT); 
       } 
      } 
      e.consume(); 
     }); 

     root.setOnMouseDragged(e-> {  
      if(selected != null){ 
       selected.setTranslateX(e.getX() - offset.getX()); 
       selected.setTranslateY(e.getY() - offset.getY()); 
      } 
      e.consume(); 
     }); 

     Scene scene = new Scene(root,500,500); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

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

Antwort

0

Sie bearbeiten die ursprüngliche Übersetzung nicht entsprechend. Sie müssen diese für diesen Wert in Ihren Berechnungen enthalten:

  • subtrahieren von der Mausposition vor contains in onMouseMoved
  • subtrahiert von der Mausposition, wenn die Berechnung offset

jedoch der Überprüfung ich empfehlen Setzen Sie den Cursor für die untergeordneten Elemente root anstatt dies in einem Event-Handler zu tun und überprüfen Sie nicht den angeklickten Knoten, sondern verwenden Sie die target von MouseEvent:

Point2D offset; 
Node selected; 
Point2D translateStart; 

@Override 
public void start(Stage primaryStage) { 
    Pane root = new Pane(); 
    Rectangle rect = new Rectangle(40, 20, 50, 100); 
    rect.setRotate(90); 
    Ellipse ellipse = new Ellipse(450, 450, 50, 25); 
    ellipse.setRotate(45); 
    Circle circle = new Circle(250, 250, 50); 
    root.getChildren().addAll(rect, ellipse, circle); 

    rect.setCursor(Cursor.HAND); 
    circle.setCursor(Cursor.HAND); 
    ellipse.setCursor(Cursor.HAND); 

    root.setOnMousePressed(e -> { 
     Node target = (Node) e.getTarget(); 
     if (target != root) { 
      // event occured on a child 
      selected = target; 
      offset = new Point2D(e.getX(), e.getY()); 
      translateStart = new Point2D(selected.getTranslateX(), selected.getTranslateY()); 
     } else { 
      selected = null; 
     } 
     e.consume(); 
    }); 

    root.setOnMouseDragged(evt -> { 
     if (selected != null) { 
      selected.setTranslateX(evt.getX() - offset.getX() + translateStart.getX()); 
      selected.setTranslateY(evt.getY() - offset.getY() + translateStart.getY()); 
     } 
     evt.consume(); 
    }); 

    Scene scene = new Scene(root, 500, 500); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
+0

Koordinatenangaben ändern sich nicht. System.out.println (ausgewählt); ** Kreis [centerX = 250.0, centerY = 250.0, radius = 50.0, fill = 0x000000ff] ** –

+0

Natürlich ändern sich die Koordinaten nicht, wenn Sie den Knoten mit 'translateX' und' translateY' ​​verschieben. – fabian

+0

Vielen Dank für Ihre Antwort. Wie verschiebe ich die Teile auf den Koordinaten? –

Verwandte Themen