JavaFX: перетащите узел в HBox - PullRequest
0 голосов
/ 06 мая 2020

У меня есть прямоугольник и другой тип узла справа, который представляет собой VBox, дочерние элементы которого представляют собой HBox, содержащий пунктирные прямоугольники над линией, разделитель и пунктирный прямоугольник под линией. Я могу перетащить левый прямоугольник, но я хочу иметь возможность перетащить его на один из меньших прямоугольников с пунктиром, чтобы перетащенный прямоугольник занял место, выделенное пунктиром. Как я могу go сделать это? Пример кода того, что у меня есть:

package sample;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Example extends Application {
    @Override
    public void start(Stage stage) {

        Rectangle r1 = new Rectangle();
        r1.setX(50);
        r1.setY(50);
        r1.setWidth(200);
        r1.setHeight(100);
        r1.setFill(Color.rgb(30,30,30));
        r1.setStroke(Color.WHITE);

        Rectangle r2 = new Rectangle();
        r2.setX(300);
        r2.setY(50);
        r2.setWidth(100);
        r2.setHeight(50);
        r2.setFill(Color.rgb(30,30,30));
        r2.setStroke(Color.WHITE);
        r2.setStyle("-fx-stroke-dash-array: 2");

        makeDraggable(r1);
        makeDraggable(r2);

        Group root = new Group(r2, r1);
        Scene scene = new Scene(root, 800, 400);
        scene.setFill(Color.rgb(30, 30, 30));
        stage.setTitle("Example");
        stage.setScene(scene);
        stage.show();
    }
    public static void main(String args[]) {
        launch(args);
    }


    private void makeDraggable(Node n) {
        final Delta dragDelta = new Delta();
        n.setOnMousePressed(mouseEvent -> {
            dragDelta.x = n.getLayoutX() - mouseEvent.getSceneX();
            dragDelta.y = n.getLayoutY() - mouseEvent.getSceneY();

        });
        n.setOnMouseDragged(mouseEvent -> {
            n.setLayoutX(mouseEvent.getSceneX() + dragDelta.x);
            n.setLayoutY(mouseEvent.getSceneY() + dragDelta.y);
        });
    }

}

class Delta { double x, y; }

Левый прямоугольник - это источник, маленькие прямоугольники с пунктирными линиями справа - это цели

...