2016-04-14 13 views
1

表示オブジェクトを移動して回転しようとしています。しかし、ドラッグして回転させたオブジェクトは、古い場所で定義されます。マウスでオブジェクトをドラッグする

オブジェクト上にマウスカーソルが移動すると、マウスカーソルが変化します。

私が間違っていることを教えてください。

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

答えて

0

あなたは最初の翻訳を適切に処理していません。あなたはこれらの値のためのあなたの計算にこれを含める必要があるだろう:

  • マウスの位置からsubstract私はお勧めしかし、マウスの位置際に計算offset

からcontains

  • onMouseMovedでsubstractをチェックする前に rootの子のカーソルをイベントハンドラで行い、クリックされたノードyourseltをチェックするのではなく、 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

    座標数値は変更されません。 System.out.println(selected); ** Circle [centerX = 250.0、centerY = 250.0、radius = 50.0、fill = 0x000000ff] ** –

    +0

    'translateX'と' translateY'を使用してノードを移動すると、もちろん座標は変更されません。 – fabian

    +0

    ありがとうございます。どのように座標に作品を移動するには? –

    関連する問題