Java FX-当节点达到0时,重置节点的translateX和translateY

时间:2018-11-12 20:59:22

标签: javafx

我有2个可拖动的StackPanes,它们之间是线形。当我拖动一个堆栈窗格时,移动StackPane旁边的行的末端相应地移动到移动堆栈窗格,而该行的另一侧保持静止(这就是我想要的)。但是我的问题是当我释放鼠标时,即停止拖动堆栈窗格时,该行返回到其原始位置。

当您按下StackPane时,我的事件处理程序:

EventHandler<MouseEvent> circleOnMousePressedEventHandler = 
            new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent t) {

                currentStackPane  = ((StackPane)(t.getSource()));
                orgSceneX = t.getSceneX();
                orgSceneY = t.getSceneY();
                layoutX =  currentStackPane.getLayoutX();
                layoutY =  currentStackPane.getLayoutY();

            }
        };

我拖动StackPane时的事件处理程序:

EventHandler<MouseEvent> circleOnMouseDraggedEventHandler = 
            new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent t) {


                double offsetX = t.getSceneX() - orgSceneX;
                double offsetY = t.getSceneY() - orgSceneY;
                currentStackPane.setTranslateX(offsetX);
                currentStackPane.setTranslateY(offsetY);
             }
        };

在拖动完成后,我尝试制作一个事件处理程序:

EventHandler<MouseEvent> circleOnMouseReleasedEventHandler = 
            new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent t) {

                currentStackPane.setLayoutX(layoutX + ((StackPane)(t.getSource())).getTranslateX());
                currentStackPane.setLayoutY(layoutY + ((StackPane)(t.getSource())).getTranslateY());
                currentStackPane.setTranslateX(0);
                currentStackPane.setTranslateY(0);
        }
};

将起点和终点绑定到堆栈窗格:

DoubleProperty startX = new SimpleDoubleProperty(vertexClickedOn.getLayoutX() + (vertexClickedOn.getWidth() / 2)); 
DoubleProperty startY = new SimpleDoubleProperty(vertexClickedOn.getLayoutY() + (vertexClickedOn.getHeight() / 2)); 
DoubleProperty endX = new SimpleDoubleProperty(vertexTo.getLayoutX() + (vertexTo.getWidth() / 2));
DoubleProperty endY = new SimpleDoubleProperty(vertexTo.getLayoutY() + (vertexTo.getHeight() / 2));

line.startXProperty().bind(startX.add(vertexClickedOn.translateXProperty()));    
line.startYProperty().bind(startY.add(vertexClickedOn.translateYProperty())); 
line.endXProperty().bind(endX.add(vertexTo.translateXProperty()));
line.endYProperty().bind(endY.add(vertexTo.translateYProperty()));

但是,如果我将其取出,则该行会停留在释放鼠标的位置,但是拖动的堆栈窗格会在释放鼠标时返回其原始位置。如果我将其保留在其中,则堆栈窗格将停留在释放鼠标的位置,但该行将返回到其原始位置。

我该如何解决?

谢谢。

1 个答案:

答案 0 :(得分:1)

问题的根本原因是startX / Y和endX / Y值未使用新的layoutX / Y值更新。建议不要将它们包含在绑定中。

line.startXProperty().bind(vertexClickedOn.layoutXProperty().add(vertexClickedOn.translateXProperty()).add(vertexClickedOn.widthProperty().divide(2)));
line.startYProperty().bind(vertexClickedOn.layoutYProperty().add(vertexClickedOn.translateYProperty()).add(vertexClickedOn.heightProperty().divide(2)));
line.endXProperty().bind(vertexTo.layoutXProperty().add(vertexTo.translateXProperty()).add(vertexTo.widthProperty().divide(2)));
line.endYProperty().bind(vertexTo.layoutYProperty().add(vertexTo.translateYProperty()).add(vertexTo.heightProperty().divide(2)));