2016-11-13 10 views
0

作成したノードをドラッグ可能にしようとしています。JavaFX:ドラッグ可能なノードの作成に問題がある

私はペインで好きなところにノードを置くことができますが、ドラッグするとノードを自動的にオフパスするように見えます。

私はノード上でマウスを押している間にそれに応じて更新されるxとyを含むDeltaクラスを作ろうとしました。

nfaPane.setOnMousePressed(event -> { 
      if (!event.getButton().equals(MouseButton.PRIMARY)) return; 
      for (final NFANode node : nfaNodes) 
       if (node.isHover()) 
        return; 
      final NFANode nfaNode = new NFANode(nfaNodes.size(), event.getX(), event.getY()); 
      nfaPane.getChildren().add(nfaNode); 
      nfaNodes.add(nfaNode); 
      Delta dragDelta = new Delta(); 
      nfaNode.setOnMousePressed(event1 -> { 
       dragDelta.setDragDeltaX(nfaNode.getLayoutX()); 
       dragDelta.setDragDeltaY(nfaNode.getLayoutY()); 
      }); 

      nfaNode.setOnMouseDragged(event1 -> { 
       nfaNode.moveTo(event1.getSceneX() + dragDelta.getDragDeltaX(), event1.getSceneY() + dragDelta.getDragDeltaY()); 
      }); 
     }); 

ノード自体は、クラスNFANodeによって定義されます。

package sample; 

import javafx.scene.Group; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Ellipse; 
import javafx.scene.text.Font; 
import javafx.scene.text.Text; 

/** 
* Created by David on 11/5/2016. 
*/ 
public class NFANode extends Group { 
    //private List<NFANode> next; 
    public static final Font nfaFont = Font.font("Footlight MT Light", 25); 
    private final Ellipse bubble; 
    private final Text text; 
    private double textWidth; 

    public NFANode(int value, double x, double y) { 
     this.text = new Text(x, y + 5, ""); 
     renumber(value); 
     this.text.setFont(nfaFont); 
     textWidth = this.text.getBoundsInLocal().getWidth(); 
     bubble = new Ellipse(x, y, this.text.getBoundsInLocal().getWidth() + 5, 25); 
     this.text.setX(x - textWidth/2); 
     bubble.setStroke(Color.BLACK); 
     bubble.setFill(Color.WHITE); 
     getChildren().addAll(bubble, this.text); 
    } 

    public Text getText() { 
     return text; 
    } 

    public void renumber(final int value) { 
     final StringBuilder builder = new StringBuilder(); 
     for (char c : String.valueOf(value).toCharArray()) builder.append((char) (c + 8272)); 
     text.setText("Q" + builder.toString()); 
    } 

    public void moveTo(final double x, final double y) { 
     bubble.setCenterX(x); 
     bubble.setCenterY(y); 
     text.setX(x - textWidth/2); 
     text.setY(y + 5); 
    } 
} 

私はドラッグするとき、これはノードの位置に影響を与える理由として困惑していますか?

enter image description here

答えて

0

あなたはそれが押されていますとき考慮にマウスの位置を取るのを忘れていました。

あなたはとてもdragDelta

startPosition - mousePressedPosition = targetPosition - mousePosition 

個人的に私は親の座標系を使用して好むが、シーンの座標を使用すると、あなたがない限り、あまりにも動作するはずである必要があり、以下の式

mousePosition - mousePressedPosition = targetPosition - startPosition 

を持っていますいくつかの変換があります。変換は単なる翻訳ではありません。

private static class Delta { 

    private double dragDeltaX; 
    private double dragDeltaY; 

    public double getDragDeltaX() { 
     return dragDeltaX; 
    } 

    public double getDragDeltaY() { 
     return dragDeltaY; 
    } 

    public void setDragDelta(double x, double y) { 
     this.dragDeltaX = x; 
     this.dragDeltaY = y; 
    } 
} 

@Override 
public void start(Stage primaryStage) { 
    Circle c = new Circle(30); 
    c.setLayoutX(50); 
    c.setLayoutY(50); 

    Pane root = new Pane(c); 

    Delta dragDelta = new Delta(); 

    c.setOnMousePressed(event1 -> { 
     Point2D mouseInParent = c.localToParent(event1.getX(), event1.getY()); 
     dragDelta.setDragDelta(c.getLayoutX() - mouseInParent.getX(), c.getLayoutY()-mouseInParent.getY()); 
     event1.consume(); 
    }); 

    c.setOnMouseDragged(event1 -> { 
     Point2D mouseInParent = c.localToParent(event1.getX(), event1.getY()); 
     c.setLayoutX(mouseInParent.getX() + dragDelta.getDragDeltaX()); 
     c.setLayoutY(mouseInParent.getY() + dragDelta.getDragDeltaY()); 
    }); 

    Scene scene = new Scene(root, 500, 500); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
関連する問題