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