Hallo,
ich soll für ein Projekt das Schachspiel programmieren. Zu den Anforderungen, die wir bekommen haben, gehört, dass die Figuren per Drag&Drop verschoben werden müssen. Ich habe zunächst mit der GUI angefangen und wollte ausprobieren, wie sich das Ziehen der Figuren umsetzen lässt.
Das Spielbrett ist eine GridPane (8x8). Jede Zelle hat ein ImageView als Kind ( ImageView[][] iVwField ).
Die ImageViews können entweder Images enthalten (für Figuren) oder null-Werte, wenn keine Figur auf dem Feld steht.
Ich habe die Figuren zunächst mal auf die oberste und die unterste Reihe platziert.
Ich wollte versuchen, die Figuren von der obersten Reihe (imgViewField[0]) auf andere Felder zu ziehen. Dabei musste ich feststellen, dass sich meine Figuren nur auf die Felder, wo schon ein Bild steht (imgViewField[7], ablegen lassen, aber nicht auf leere Felder (imgViewField[6]).
Für Drag&Drop habe ich zwei Methoden geschrieben, einmal für Source und einmal für Target.
Die Methoden werden in der initialize-Methode im Controller folgenderweise aufgerufen:
Was mache ich falsch? Wie könnte ich das umschreiben, damit sich meine Figuren auch auf leere Felder ziehen lassen?
ich soll für ein Projekt das Schachspiel programmieren. Zu den Anforderungen, die wir bekommen haben, gehört, dass die Figuren per Drag&Drop verschoben werden müssen. Ich habe zunächst mit der GUI angefangen und wollte ausprobieren, wie sich das Ziehen der Figuren umsetzen lässt.
Das Spielbrett ist eine GridPane (8x8). Jede Zelle hat ein ImageView als Kind ( ImageView[][] iVwField ).
Die ImageViews können entweder Images enthalten (für Figuren) oder null-Werte, wenn keine Figur auf dem Feld steht.
Ich habe die Figuren zunächst mal auf die oberste und die unterste Reihe platziert.
Ich wollte versuchen, die Figuren von der obersten Reihe (imgViewField[0]) auf andere Felder zu ziehen. Dabei musste ich feststellen, dass sich meine Figuren nur auf die Felder, wo schon ein Bild steht (imgViewField[7], ablegen lassen, aber nicht auf leere Felder (imgViewField[6]).
Für Drag&Drop habe ich zwei Methoden geschrieben, einmal für Source und einmal für Target.
Java:
private void makeImageViewsDraggable(ImageView sourceNode){
sourceNode.setOnDragDetected((MouseEvent event) -> {
Dragboard db = sourceNode.startDragAndDrop(TransferMode.ANY);
ClipboardContent content = new ClipboardContent();
content.putImage(sourceNode.getImage());
db.setContent(content);
event.consume();
});
sourceNode.setOnDragDone((DragEvent event) -> {
if (event.getTransferMode() == TransferMode.MOVE) {
sourceNode.setImage(null);
}
event.consume();
});
}
private void setGestureTarget(ImageView targetNode){
targetNode.setOnDragOver((DragEvent event) -> {
if (event.getGestureSource() != targetNode &&
event.getDragboard().hasImage()) {
event.acceptTransferModes(TransferMode.COPY_OR_MOVE);
}
event.consume();
});
targetNode.setOnDragEntered((DragEvent event) -> {
if (event.getGestureSource() != targetNode && event.getDragboard().hasImage()) {
targetNode.setEffect(new DropShadow());
}
});
targetNode.setOnDragExited((DragEvent event) -> {
if (!event.isDropCompleted() &&
event.getGestureSource() != targetNode &&
event.getDragboard().hasImage()) {
targetNode.setEffect(null);
}
event.consume();
});
targetNode.setOnDragDropped((DragEvent event) -> {
Dragboard db = event.getDragboard();
boolean success = false;
if (db.hasImage()) {
targetNode.setImage(db.getImage());
success = true;
}
event.setDropCompleted(success);
event.consume();
});
}
Die Methoden werden in der initialize-Methode im Controller folgenderweise aufgerufen:
Java:
@Override
public void initialize(URL location, ResourceBundle resources) {
initGrid(grdPane); //GridPane (8x8) wird erstellt
imgViewField = initImageViews(grdPane); //Erstellt ein zur GridPane korrespondierendes ImageView-Array
setImages(imgViewField); //Setzt Bilder auf die Felder
for (int i = 0; i < imgViewField.length; i++) {
for (int j = 0; j < imgViewField[0].length; j++) {
makeImageViewsDraggable(imgViewField[i][0]);
setGestureTarget(imgViewField[i][7]);
setGestureTarget(imgViewField[i][6]);
}
}
}
Was mache ich falsch? Wie könnte ich das umschreiben, damit sich meine Figuren auch auf leere Felder ziehen lassen?
Zuletzt bearbeitet: