package com.stevenliebregt.test; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.geometry.Insets; import javafx.scene.control.Button; import javafx.scene.input.ClipboardContent; import javafx.scene.input.DataFormat; import javafx.scene.input.Dragboard; import javafx.scene.input.TransferMode; import javafx.scene.layout.*; import javafx.scene.paint.Color; import java.net.URL; import java.util.ResourceBundle; public class GameController implements Initializable { private static final int HAND_SIZE = 7; private static final int BOARD_SIZE = 15; private static final DataFormat TILE_FORMAT = new DataFormat("Tile"); @FXML private GridPane boardGridPane; @FXML private GridPane handGridPane; private Button draggingTile; @Override public void initialize(URL location, ResourceBundle resources) { initializeHand(); initializeBoard(); } private void initializeHand() { for (int i = 0; i < HAND_SIZE; i++) { StackPane stackPane = new StackPane(); stackPane.setPrefSize(80, 80); stackPane.setBackground(new Background(new BackgroundFill( Color.SALMON, CornerRadii.EMPTY, Insets.EMPTY ))); handGridPane.add(stackPane, i, 0); Button tile = new Button(); tile.setPrefSize(80, 80); tile.setText("A"); tile.setOnDragDetected(event -> { Dragboard dragboard = tile.startDragAndDrop(TransferMode.MOVE); dragboard.setDragView(tile.snapshot(null, null)); ClipboardContent clipboardContent = new ClipboardContent(); clipboardContent.put(TILE_FORMAT, " "); dragboard.setContent(clipboardContent); draggingTile = tile; }); stackPane.setOnDragOver(event -> { Dragboard dragboard = event.getDragboard(); if (dragboard.hasContent(TILE_FORMAT) && draggingTile != null) { event.acceptTransferModes(TransferMode.MOVE); } }); stackPane.setOnDragDropped(event -> { // TODO: CHECK IF ALREADY HAS A TILE Dragboard dragboard = event.getDragboard(); if (dragboard.hasContent(TILE_FORMAT)) { ((StackPane) draggingTile.getParent()).getChildren().remove(draggingTile); stackPane.getChildren().add(draggingTile); event.setDropCompleted(true); draggingTile = null; } }); stackPane.getChildren().add(tile); } } private void initializeBoard() { for (int row = 0; row < BOARD_SIZE; row++) { for (int column = 0; column < BOARD_SIZE; column++) { StackPane stackPane = new StackPane(); stackPane.prefWidthProperty().bind(boardGridPane.widthProperty().divide(BOARD_SIZE)); stackPane.prefHeightProperty().bind(boardGridPane.heightProperty().divide(BOARD_SIZE)); if ((row + column) % 2 == 0) { stackPane.setBackground(new Background(new BackgroundFill( Color.GOLD, CornerRadii.EMPTY, Insets.EMPTY ))); } stackPane.setOnDragOver(event -> { Dragboard dragboard = event.getDragboard(); if (dragboard.hasContent(TILE_FORMAT) && draggingTile != null) { event.acceptTransferModes(TransferMode.MOVE); } }); stackPane.setOnDragDropped(event -> { // TODO: CHECK IF ALREADY HAS A CHILD Dragboard dragboard = event.getDragboard(); if (dragboard.hasContent(TILE_FORMAT)) { ((StackPane) draggingTile.getParent()).getChildren().remove(draggingTile); stackPane.getChildren().add(draggingTile); event.setDropCompleted(true); draggingTile = null; } }); boardGridPane.add(stackPane, column, row); } } } }