Java 在其父窗格中移动节点,然后将其放到另一个窗格中

Java 在其父窗格中移动节点,然后将其放到另一个窗格中,java,javafx,drag-and-drop,drag,Java,Javafx,Drag And Drop,Drag,通过为MouseEvent添加适当的处理程序,在其父窗格中移动节点(Label)(我们称之为移动节点)可以正常工作: node.setOnMousePressed(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent mouseEvent) { x = node.getLayoutX() - mouseEvent.getSceneX(); y = nod

通过为
MouseEvent
添加适当的处理程序,在其父
窗格中移动节点(
Label
(我们称之为移动节点)可以正常工作:

node.setOnMousePressed(new EventHandler<MouseEvent>() {
    @Override public void handle(MouseEvent mouseEvent) {
        x = node.getLayoutX() - mouseEvent.getSceneX();
        y = node.getLayoutY() - mouseEvent.getSceneY();
    }
});

node.setOnMouseDragged(new EventHandler<MouseEvent>() {
    @Override public void handle(MouseEvent mouseEvent) {
        node.setLayoutX(mouseEvent.getSceneX() + x);
        node.setLayoutY(mouseEvent.getSceneY() + y);
    }
});
和目标:

    target.setOnDragOver(new EventHandler <DragEvent>() {
        @Override public void handle(DragEvent event) {
            event.acceptTransferModes(TransferMode.COPY_OR_MOVE);
            event.consume();
        }
    });

    target.setOnDragDropped(new EventHandler <DragEvent>(){
        @Override public void handle(DragEvent event) {
            Dragboard dragboard = event.getDragboard();
            if (dragboard.hasString())  {
                Node dragged = scene.lookup("#"+dragboard.getString());
                ((Pane) dragged.getParent()).getChildren().remove(dragged);
                target.getChildren().add(dragged);
                event.setDropCompleted(true);
            }
            else{
                event.setDropCompleted(false);
            }
            event.consume();
        }
    });

您使用附加的
MouseEvent
s的目的是什么?如果只是为了实时显示节点及其位置,则可以尝试设置拖动视图。请看这个问题:我希望能够将它移动到任何地方:在其父窗格中,或移动到另一个窗格中
    target.setOnDragOver(new EventHandler <DragEvent>() {
        @Override public void handle(DragEvent event) {
            event.acceptTransferModes(TransferMode.COPY_OR_MOVE);
            event.consume();
        }
    });

    target.setOnDragDropped(new EventHandler <DragEvent>(){
        @Override public void handle(DragEvent event) {
            Dragboard dragboard = event.getDragboard();
            if (dragboard.hasString())  {
                Node dragged = scene.lookup("#"+dragboard.getString());
                ((Pane) dragged.getParent()).getChildren().remove(dragged);
                target.getChildren().add(dragged);
                event.setDropCompleted(true);
            }
            else{
                event.setDropCompleted(false);
            }
            event.consume();
        }
    });
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Cursor;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;


public class DragTest extends Application {

    private double x, y;
    private boolean isEnableDargAndDrop;
    private Scene scene;

    @Override public void start(Stage primaryStage) throws Exception {

        isEnableDargAndDrop = true;
        GridPane root = new GridPane();
        Label label = getLabel();
        Pane leftPane = getPane(label, "cyan");
        root.add(leftPane,0,0);
        Pane rightPane = getPane(null, "yellow");
        root.add(rightPane,1,0);
        scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
        addDragSupport(label);
        addDropSupport(rightPane);
        addDropSupport(leftPane);
    }

    private Label getLabel() {

        Label label = new Label(" Move me ");
        label.setId("label");
        label.setStyle("-fx-background-color:white;-fx-border-width: 1;-fx-border-color: red;" );
        return label;
    }

    private Pane getPane(Node label, String color) {

        Pane pane = (label == null)? new Pane() : new Pane(label);
        pane.setStyle("-fx-background-color:"+color+";");
        pane.setPrefSize(150,100);
        return pane;
    }

    private void addDragSupport(Node node) {

        node.setOnMousePressed(new EventHandler<MouseEvent>() {
            @Override public void handle(MouseEvent mouseEvent) {
                x = node.getLayoutX() - mouseEvent.getSceneX();
                y = node.getLayoutY() - mouseEvent.getSceneY();
                node.setCursor(Cursor.MOVE);
            }
        });
        node.setOnMouseReleased(new EventHandler<MouseEvent>() {
            @Override public void handle(MouseEvent mouseEvent) {
                node.setCursor(Cursor.HAND);
            }
        });
        node.setOnMouseDragged(new EventHandler<MouseEvent>() {
            @Override public void handle(MouseEvent mouseEvent) {
                node.setLayoutX(mouseEvent.getSceneX() + x);
                node.setLayoutY(mouseEvent.getSceneY() + y);
            }
        });
        node.setOnMouseEntered(new EventHandler<MouseEvent>() {
            @Override public void handle(MouseEvent mouseEvent) {
                node.setCursor(Cursor.HAND);
            }
        });

        node.setOnDragDetected(new EventHandler <MouseEvent>()  {
            @Override public void handle(MouseEvent event) {
                if(! isEnableDargAndDrop ) { return;}
                Dragboard dragboard = node.startDragAndDrop(TransferMode.COPY_OR_MOVE);
                ClipboardContent content = new ClipboardContent();
                content.putString(node.getId());
                dragboard.setContent(content);
                event.consume();
            }
        });
    }

    private void addDropSupport(Pane target) {

        target.setOnDragOver(new EventHandler <DragEvent>() {
            @Override public void handle(DragEvent event) {
                event.acceptTransferModes(TransferMode.COPY_OR_MOVE);
                event.consume();
            }
        });

        target.setOnDragDropped(new EventHandler <DragEvent>(){
            @Override public void handle(DragEvent event) {

                Dragboard dragboard = event.getDragboard();

                if (dragboard.hasString())  {

                    Node dragged = scene.lookup("#"+dragboard.getString());
                    if((dragged == null) || (dragged.getParent() == target)) {return;}

                    ((Pane) dragged.getParent()).getChildren().remove(dragged);
                    target.getChildren().add(dragged);
                    event.setDropCompleted(true);
                }
                else{
                    event.setDropCompleted(false);
                }
                event.consume();
            }
        });
    }

    public static void main (String[] args) {launch(null);  }
}