Shape Drag und Drop in JavaFX
In diesem Artikel lernst du die Verwendung von Drag und Drop in JavaFX. Dabei handelt es sich um ein verbreitetes Verfahren bei Programmen. Man kann ein Element (z.B. Node) “draggen” – ziehen und “droppen” – fallen lassen. Während der Drag-and-drop Gesture können verschiedene Datentypen transferiert werden, z.B. Text, Bilder, URLs, Dateien, Bytes, und Strings. Drag and drop wird auch zwischen verschiedenen JavaFX Applications verwendet werden. Der Code wird in Form von Kommentaren erklärt.
Beispiel für Drag und Drop in JavaFX
package application;
import java.util.ArrayList;
import javafx.application.Application;
import javafx.scene.Cursor;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Shape;
import javafx.stage.Stage;
public class Main extends Application {
// x und y Werte unserer Main Scene
double mainSceneX, mainSceneY;
// Die Liste unserer Nodes (hier Vierecke)
private ArrayList nodes;
@Override
public void start(Stage primaryStage) {
Group root = new Group();
Scene scene = new Scene(root, 400, 300);
// Viereck das Bewegt wird
Rectangle rectToMove = new Rectangle(50, 50, 50, 50);
// Viereck das unser Ziel ist
Rectangle rectTarget = new Rectangle(150, 150, 100, 100);
// hinzufügen unserer Vierecke (Nodes)
nodes = new ArrayList<>();
nodes.add(rectToMove);
nodes.add(rectTarget);
// hier setzen wir die Maus, sodass sie
// eine Hand wird, wenn wir drüber fahren
rectToMove.setCursor(Cursor.HAND);
// das wird aufgerufen, wenn unsere Maus auf
// das Viereck drückt
rectToMove.setOnMousePressed((t) -> {
mainSceneX = t.getSceneX();
mainSceneY = t.getSceneY();
Rectangle r = (Rectangle) (t.getSource());
r.toFront();
});
// Wird aufgerufen, wenn unser Viereck sich bewegt
// also sehr häufig
rectToMove.setOnMouseDragged((t) -> {
double offsetX = t.getSceneX() - mainSceneX;
double offsetY = t.getSceneY() - mainSceneY;
Rectangle r = (Rectangle) (t.getSource());
r.setX(r.getX() + offsetX);
r.setY(r.getY() + offsetY);
mainSceneX = t.getSceneX();
mainSceneY = t.getSceneY();
checkBounds(rectTarget);
});
// wird aufgerufen, wenn man die Maus loslässt
rectToMove.setOnMouseReleased((t) -> {
rectToMove.setFill(Color.BLACK);
});
root.getChildren().addAll(rectToMove,rectTarget);
primaryStage.setScene(scene);
primaryStage.show();
}
// Diese Methode sucht nach einer Kollision. Danke an Jewelsea von StackOverflow
// Diese Methode wird jedes mal aufgerufen wenn man unser kleines Viereck
// gedraggt wird.
private void checkBounds(Shape block) {
boolean collisionDetected = false;
for (Shape static_bloc : nodes) {
if (static_bloc != block) {
static_bloc.setFill(Color.YELLOW);
if (block.getBoundsInParent().intersects(static_bloc.getBoundsInParent())) {
collisionDetected = true;
}
}
}
if (collisionDetected) {
block.setFill(Color.GREEN);
} else {
block.setFill(Color.BLUE);
}
}
public static void main(String[] args) {
launch(args);
}
}
[image img_id=”6279″ alt=”Drag und Drop in JavaFX” width=”300″ height=”254″]
Um mehr über Drag und Drop in JavaFX für z.B. Text zu erfahren und noch mehr der verschiedenen Methoden von Drag und Drop, besuche die Documentation