Java FX - сбросьте translateX и translateY узла, когда он достигнет 0 - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть 2 перетаскиваемых StackPanes, и между ними есть форма линии. Когда я перетаскиваю одну панель стека, конец строки рядом с движущейся панелью стека перемещается соответственно к области перемещения стека, а другая сторона линии остается неподвижной (что я и хочу). Однако моя проблема заключается в том, что когда я отпускаю мышь, то есть прекращаю перетаскивать панель стека, линия возвращается в исходное положение.

Мой обработчик событий при нажатии на 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 голосов
/ 13 ноября 2018

Основная причина вашей проблемы - значения 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)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...