首页 > 解决方案 > JavaFX:将节点拖入 HBox

问题描述

我有一个矩形,右边的另一种类型的节点是一个 VBox,它的子节点是一个 HBox,其中包含线上方的虚线矩形、分隔符和线下方的虚线矩形。我可以拖放左侧的矩形,但我希望能够将它拖到较小的虚线矩形之一上,并让拖动的矩形取代虚线的位置。我该怎么做呢?到目前为止我所拥有的示例代码:

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

左边的矩形是源,右边有虚线的小矩形是目标

标签: user-interfacejavafxdrag-and-dropjavafx-8

解决方案


推荐阅读