From 4a146556f7d43b9eb86cbd607dd468bc7e9609f8 Mon Sep 17 00:00:00 2001 From: Nimrod Abramovich <grumpydormin@gmail.com> Date: Fri, 13 Mar 2020 01:17:46 +0000 Subject: [PATCH] animations added, almost complete --- bin/coursework/Animation.class | Bin 0 -> 5755 bytes bin/coursework/Cage.class | Bin 5201 -> 5207 bytes bin/coursework/ConstraintsHandler.class | Bin 5128 -> 5376 bytes bin/coursework/GameState.class | Bin 871 -> 871 bytes bin/coursework/Main.class | Bin 22015 -> 24444 bytes src/coursework/Animation.java | 184 ++++++++++++++++++++ src/coursework/ConstraintsHandler.java | 16 +- src/coursework/Main.java | 214 ++++++++++++++++-------- 8 files changed, 342 insertions(+), 72 deletions(-) create mode 100644 bin/coursework/Animation.class create mode 100644 src/coursework/Animation.java diff --git a/bin/coursework/Animation.class b/bin/coursework/Animation.class new file mode 100644 index 0000000000000000000000000000000000000000..ea9fd11221e9b362801b9cf1f759bb0931b3b95c GIT binary patch literal 5755 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 I;SPf&03|}rb^rhX literal 0 HcmV?d00001 diff --git a/bin/coursework/Cage.class b/bin/coursework/Cage.class index 70a114efa9b35343e040b2214c124d1c0de03eb7..f93cf6cd92afb4721aa5581143ec6bcac4afbf0f 100644 GIT binary patch delta 450 zcmcbpab07>9s%c21{MZ>1_nkUtt|}V`&bq*uxtdeBCS~V*)iKLXZSA3BBN&m5#rcq z#?EZUww&RHB!?)Qo*ApODC>NN6O;c7=+>)>^2}mT(AvVFEXm2NC%~2=$;qOZU?jq@ zU=zclZ44`xGgOFjvn*gBpl;oAh5%9SSqy5TJWLDln745`g9b>QvM3MB0tQ(vPPoOB zHwa2{s<$vP%E&JK&o%jypj~}C!z_j_hS>~L8RjsoXPC>diD4eYUWWM$*BKTt++tYB z@RVT@!+(Z8MoxxaMnQ(<3>FLw3_%PWpip73WUyjjV31{a!?2x!gMpF3gyA&94h9Ye zRt5)#{R}%9*cdn&+!=N->|$VJ;9>}3Sj(`RfrEjYA(mkg!yX0>1|EhaCWg6_CkmM} z#!NmbB*Ut%{+~f*@++aEf-wv%49pA+3}R9OY&kYk0&J7_3CpXpGHhbtV%Q9JgaSmK WAsFNs237_^hMQnVa7|_s@dp6cDPoEM delta 490 zcmcbvaZzK#9s%b-1{MZ>1_nkxtt|}V`&bq*uxtdeBCS~V*)iKLXZS41BBN&m5#rcq z#?EZUww&RLB!?)Qo*ApODC>NNBa{CN=+>)<^2}n8*V@9MEXm2N$B`k)$)cBFB*L&@ z6T_ly3@es1l!|h*EMUN|Y~6AOKT+;k4633$Obc+EwsARwI!Kw4C=bg51{sj0>ey`E z(!$0l$|lOb@V|Bo6Qhjm!vB1euL;`Kw=v9O=wz79Foj_b!&-*93>z5cG3;iT&v1od z0mF5Mg$$1v7BT#0=woDM=w;+(Sk7R<z`zj1zyS&+21^Dj1_lOMh8GOm88{di8B7?C zGwfjCU|?l%VA##DlYxzalfj)~3&So3HU=(+AcmC;yBRnbxEW#@<}vJH;9%fkNMd4` zIeDs(Ib-zXvqCbgYHI%(lqbIvIvO0sz{0@Hz`!6P#gStp#Zh3(x`!*0S=v96MaF*v x0|NsSgE<2O10Pt;Mg|s!O$;0io57A#0E>w*1cMyOz``KFa1-n}j>#M%{s1X5YWM&E diff --git a/bin/coursework/ConstraintsHandler.class b/bin/coursework/ConstraintsHandler.class index d80f886ace8cb45794c9249a022cb37de2a66d45..0a68b66c3ee4a187021e0e0b1082d8babf7d6818 100644 GIT binary patch literal 5376 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 literal 5128 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 diff --git a/bin/coursework/GameState.class b/bin/coursework/GameState.class index 7da95ce3340cd26d28aaa90c45379d71f8c06b7d..05a8e904dce51e954e51bf717fb058b235294275 100644 GIT binary patch delta 13 UcmaFP_MC0QOD0B@$*-7d0V)IqmjD0& delta 13 UcmaFP_MC0QOD0Ci$*-7d0V&M|i~s-t diff --git a/bin/coursework/Main.class b/bin/coursework/Main.class index eebd54f556d3480d151a72b3fd5448dad7431061..0bac322ce29c478d59d85bef452194620b73f727 100644 GIT binary patch literal 24444 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 literal 22015 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 A{r~^~ diff --git a/src/coursework/Animation.java b/src/coursework/Animation.java new file mode 100644 index 0000000..cdf17e1 --- /dev/null +++ b/src/coursework/Animation.java @@ -0,0 +1,184 @@ +package coursework; + +import javafx.animation.Timeline; +import java.util.ArrayList; +import java.util.List; +import javafx.animation.KeyFrame; +import javafx.scene.layout.VBox; +import javafx.util.Duration; + +public class Animation { + + private VBox[] gridBoxes; + private String[] colors = {"#FF0000", "#FF7F00", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF", "#3F00FF", "#7F00FF", "rgba(255,0,0,0)"}; + private Integer[] indexArray; + private List<Integer> indexList = new ArrayList<Integer>(); + private int index = 0; + private int count = 1; + private int colorIndex = 0; + + public Animation() { + gridBoxes = Main.getGridBoxes(); + } + + public void go() { + initialiseIndex(); + Timeline timeline = new Timeline(); + KeyFrame keyframe = new KeyFrame(Duration.seconds(0.1), e -> { + if (index != indexArray.length) { + for (int j = 0; j < colors.length; j++) { + if (index - j >= 0) { + if (indexArray[index - j] >= 0 && indexArray[index] - j <= Main.N*Main.N) { + gridBoxes[indexArray[index - j]].setStyle("-fx-background-color:"+colors[j]+";"); + } + } + } + index++; + } + if (index == indexArray.length && count < 9) { + for (int i = 0; i < colors.length - count; i++) { + gridBoxes[indexArray[indexArray.length - i - 1]].setStyle("-fx-background-color:"+colors[i+count]+";"); + } + count++; + } + if (count == 9) { + if (Main.N % 2 == 0) { + //even + int maxCentre = Main.N / 2; + int minCentre = maxCentre - 1; + + int topLeft = (minCentre * Main.N) + minCentre; + int topRight = (minCentre * Main.N) + maxCentre; + int botLeft = (maxCentre * Main.N) + minCentre; + int botRight = (maxCentre * Main.N + maxCentre); + int[] gridIndicies = { topLeft, topRight, botLeft, botRight }; + + if (colorIndex < colors.length) { + for (int gridIndex : gridIndicies) { + gridBoxes[gridIndex].setStyle("-fx-background-color:"+colors[colorIndex]+";"); + } + } + if (colorIndex - 1 > 0 && colorIndex < colors.length + 1) { + gridBoxes[topLeft - 1].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";"); + gridBoxes[topLeft - Main.N].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";"); + gridBoxes[topLeft - Main.N - 1].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";"); + + gridBoxes[topRight + 1].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";"); + gridBoxes[topRight - Main.N].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";"); + gridBoxes[topRight - Main.N + 1].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";"); + + gridBoxes[botLeft - 1].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";"); + gridBoxes[botLeft + Main.N].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";"); + gridBoxes[botLeft + Main.N - 1].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";"); + + gridBoxes[botRight + 1].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";"); + gridBoxes[botRight + Main.N].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";"); + gridBoxes[botRight + Main.N + 1].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";"); + } + + + + } + else { + //odd + int centre = Main.N - 1 / 2; + + gridBoxes[centre * Main.N + centre].setStyle("-fx-background-color:"+colors[colorIndex]+";"); + } + colorIndex++; + } + + }); + timeline.getKeyFrames().add(keyframe); + timeline.setCycleCount(indexArray.length + 20); + timeline.play(); + + } + + private void initialiseIndex() { + for (int i = 0; i < Main.N; i++) { + for (int j = 0; j < Main.N; j++) { + if (i % 2 == 0) { + indexList.add(i*Main.N + j); + } + else { + indexList.add((i+1) * Main.N - 1 - j); + } + } + } + + if (getPrevious(indexList) % Main.N == 0) { + // even n + for (int j = 0; j < Main.N / 2; j++) { + moveUpDown(1, Main.N - 1); + moveLeftRight(1, 1); + moveUpDown(-1, Main.N - 1); + if (j != Main.N/2 - 1) { + moveLeftRight(1, 1); + } + } + + int count = Main.N - 1; + moveLeftRight(-1, count); + moveUpDown(1, count); + moveLeftRight(1, count); + count--; + + while (count > 0) { + moveUpDown(-1, count); + moveLeftRight(-1, count); + count--; + moveUpDown(1, count ); + moveLeftRight(1, count); + count--; + } + } + else { + // odd n + for (int j = 0; j < Main.N / 2; j++) { + moveUpDown(1, Main.N - 1); + moveLeftRight(-1, 1); + moveUpDown(-1, Main.N - 1); + moveLeftRight(-1, 1); + } + moveUpDown(1, Main.N - 1); + + int count = Main.N - 1; + moveLeftRight(1, count); + moveUpDown(-1, count); + moveLeftRight(-1, count); + + while (count > 3) { + count--; + moveUpDown(1, count); + moveLeftRight(1, count); + count--; + moveUpDown(-1, count); + moveLeftRight(-1, count); + } + count--; + moveUpDown(1, count); + moveLeftRight(1, count); + } + + indexArray = indexList.toArray(new Integer[indexList.size()]); + } + + private Integer getPrevious(List<Integer> indexList) { + return indexList.get(indexList.size() - 1); + } + + private void moveUpDown(int value, int n) { + // value == 1 to move up, value == -1 to move down + for (int i = 0; i < n; i++) { + indexList.add(getPrevious(indexList) - Main.N*value); + } + } + + private void moveLeftRight(int value, int n) { + // value == 1, move right, value == -1 move left + for (int i = 0; i < n; i++) { + indexList.add(getPrevious(indexList) + value); + } + } +} diff --git a/src/coursework/ConstraintsHandler.java b/src/coursework/ConstraintsHandler.java index be56672..989872b 100644 --- a/src/coursework/ConstraintsHandler.java +++ b/src/coursework/ConstraintsHandler.java @@ -12,7 +12,7 @@ public class ConstraintsHandler { private VBox[] gridBoxes = new VBox[Main.N*Main.N]; private List<Cage> gridCages = new ArrayList<Cage>(); private boolean[][] gridErrors = new boolean[Main.N*Main.N][3]; - + private boolean constraintChecked = false; public ConstraintsHandler() {} @@ -23,7 +23,12 @@ public class ConstraintsHandler { gridErrors = Main.getGridErrors(); } + public boolean checked() { + return constraintChecked; + } + public void checkConstraints(int col, int row, boolean showMistakes) { + constraintChecked = true; updateData(); columnConstraint(row, col); rowConstraint(row, col); @@ -136,16 +141,17 @@ public class ConstraintsHandler { } public void checkWinCondition() { + updateData(); if (checkCellsFull() && checkConstraintErrors()) { - // win condition fulfilled - // animation and pop up - System.out.println("You won"); + Animation animation = new Animation(); + animation.go(); } } private boolean checkCellsFull() { + System.out.println(""); for (TextField textField : gridNumbers) { - if (!textField.getText().equals("")) { + if (textField.getText().equals("")) { return false; } } diff --git a/src/coursework/Main.java b/src/coursework/Main.java index 3416de1..9c8ff2f 100644 --- a/src/coursework/Main.java +++ b/src/coursework/Main.java @@ -19,6 +19,7 @@ import javafx.scene.control.Button; import javafx.scene.control.ButtonType; import javafx.scene.control.CheckBox; import javafx.scene.control.Label; +import javafx.scene.control.TextArea; import javafx.scene.control.TextField; import javafx.scene.image.Image; import javafx.scene.image.ImageView; @@ -30,12 +31,12 @@ import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import javafx.stage.FileChooser; +import javafx.stage.Modality; import javafx.stage.Stage; public class Main extends Application { - final static public int N = 5; - final private double GRID_PERCENTAGE = 0.75; + final static public int N = 6; private Scene scene; private Stage stage; @@ -48,7 +49,6 @@ public class Main extends Application { private static boolean[][] gridErrors = new boolean[N*N][3]; private static boolean showMistakes = false; - private boolean isWider; private Pane previousPane = null; private Square previousSquare = null; private boolean clearing = false; @@ -86,18 +86,19 @@ public class Main extends Application { public static boolean[][] getGridErrors() { return gridErrors; } - ////////////////////////////////////////////////////////////////////////////////// - - private GridPane setupGrid() { + // + //////////////////////////////////////////////////////////////////////////////// + private GridPane setupGrid(int width, int height) { GridPane gridPane = new GridPane(); gridPane.setAlignment(Pos.CENTER); - double size = (scene.getWidth() * GRID_PERCENTAGE) / N; - + double value = width < height ? width : height; + double size = value / N; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { gridPane = addToGridPane(gridPane, size, i, j); } } + return gridPane; } @@ -182,29 +183,13 @@ public class Main extends Application { loadFileButtonClickEvent(); }); - return topHBox; - } - - private void createNewCage(String line) { - String[] splitLine = line.split(" "); - String[] shiftedIds = splitLine[1].split(","); - int[] ids = new int[shiftedIds.length]; - for (int i = 0; i < shiftedIds.length; i++) { - ids[i] = Integer.parseInt(shiftedIds[i]) - 1; - } - - if (splitLine[0].contains("÷")) { - splitLine[0] = splitLine[0].replace("÷", "�"); - } - - int value = Integer.parseInt(splitLine[0].substring(0, splitLine[0].length()- 1)); - String operator = splitLine[0].substring(splitLine[0].length() - 1); + loadGameTextInputButton.setOnAction(e -> { + loadTextButtonClickEvent(); + }); - Cage cage = new Cage(ids, value, operator); - gridCages.add(cage); + return topHBox; } - private void updateGameState(GameState gameState) { String[] gameValues = gameState.getGameState(); for (int i = 0; i < gridNumbers.length; i++) { @@ -239,34 +224,43 @@ public class Main extends Application { private VBox setupNumbersVBox() { VBox vbox = new VBox(); + Button balanceButtonTop = new Button(""); + balanceButtonTop.setPrefWidth(111); + balanceButtonTop.setVisible(false); + Button balanceButtonBottom = new Button(""); + balanceButtonBottom.setPrefWidth(111); + balanceButtonBottom.setVisible(false); + vbox.getChildren().add(balanceButtonTop); for (int i = 1; i <= N; i++) { Button button = new Button(i + ""); - double cellWidth = gridSquares[0].getRectangle().getWidth() / 2; - double fontSize = cellWidth * 0.4; + final double WIDTH = 50; - button.setPrefSize(cellWidth, cellWidth); - button.setMaxSize(150, 150); - button.setStyle("-fx-font-size:"+fontSize+"pt"); + button.setPrefSize(WIDTH, WIDTH); + button.setMaxSize(WIDTH, WIDTH); + button.setStyle("-fx-font-size:"+18+"pt"); button.setOnAction(e -> { numbersButtonClickEvent(button); }); vbox.getChildren().add(button); } + vbox.getChildren().add(balanceButtonBottom); vbox.setSpacing(10); - vbox.setAlignment(Pos.CENTER); + vbox.setAlignment(Pos.CENTER_LEFT); return vbox; } private VBox setupFontSizeHBox() { VBox vbox = new VBox(); - vbox.getChildren().addAll(setupButton("Tiny", 10), setupButton("Small", 14), setupButton("Medium", 18), setupButton("Large", 22), setupButton("Huge", 26)); - vbox.setSpacing(10); + vbox.getChildren().addAll(setupButton("Tiny", 10, 71), setupButton("Small", 14, 81), setupButton("Medium", 18, 91), setupButton("Large", 22, 101), setupButton("Huge", 26, 111)); + vbox.setSpacing(15); vbox.setAlignment(Pos.CENTER); return vbox; } - private Button setupButton(String name, int size) { + private Button setupButton(String name, int size, int width) { Button button = new Button(name); + button.setMinWidth(width); + button.setPrefWidth(width); button.setStyle("-fx-font-size:" + size + "px;"); button.setOnAction(e -> { changeFontSizeEvent(size); @@ -274,6 +268,59 @@ public class Main extends Application { return button; } + private void createNewCage(String line) { + String[] splitLine = line.split(" "); + String[] shiftedIds = splitLine[1].split(","); + int[] ids = new int[shiftedIds.length]; + + for (int i = 0; i < shiftedIds.length; i++) { + ids[i] = Integer.parseInt(shiftedIds[i]) - 1; + } + + if (splitLine[0].contains("÷") || splitLine[0].contains("/")) { + splitLine[0] = splitLine[0].replace("÷", "�"); + } + + int value = Integer.parseInt(splitLine[0].substring(0, splitLine[0].length()- 1)); + String operator = splitLine[0].substring(splitLine[0].length() - 1); + + Cage cage = new Cage(ids, value, operator); + gridCages.add(cage); + } + + + private void clearGridAlert() { + clearing = true; + Alert alert = new Alert(AlertType.CONFIRMATION); + alert.setContentText("Are you sure you wish to clear the board?"); + alert.setTitle("Clearing Board."); + alert.showAndWait().ifPresent(type -> { + if (type == ButtonType.OK) { + clearGridData(); + undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers))); + } + });; + clearing = false; + } + + private void clearEmptyGridAlert() { + Alert alert = new Alert(AlertType.WARNING); + alert.setContentText("Nothing to clear on the board."); + alert.setTitle("Empty Board"); + alert.showAndWait(); + } + + private void clearGridData() { + for (TextField textField : gridNumbers) { + textField.setText(""); + } + for (int i = 0; i < N*N; i++) { + for (int j = 0; j < 3; j++) { + gridErrors[i][j] = false; + } + } + } + /////////////////////////////////////////////////////////// private void loadFileButtonClickEvent() { try { @@ -294,9 +341,51 @@ public class Main extends Application { } } + private void loadTextButtonClickEvent() { + Stage popupStage = new Stage(); + popupStage.initModality(Modality.APPLICATION_MODAL); + popupStage.initOwner(stage); + + VBox vbox = new VBox(); + vbox.setPadding(new Insets(10)); + vbox.setSpacing(10); + + HBox hbox = new HBox(); + hbox.setSpacing(162); + + TextArea textArea = new TextArea(); + Button cancelButton = new Button("Cancel"); + cancelButton.setAlignment(Pos.TOP_LEFT); + cancelButton.setOnAction(e -> { + popupStage.hide(); + }); + Button loadButton = new Button("Load"); + loadButton.setAlignment(Pos.TOP_RIGHT); + loadButton.setOnAction(e -> { + String[] lines = textArea.getText().split("\n"); + for (String line : lines) { + if (!line.equals(null) && !line.equals("")) { + createNewCage(line); + } + } + popupStage.hide(); + }); + + hbox.getChildren().addAll(cancelButton, loadButton); + vbox.getChildren().addAll(textArea, hbox); + + popupStage.setScene(new Scene(vbox, 300, 300)); + popupStage.show(); + } + private void showMistakesCheckEvent(CheckBox showMistakesCheck) { + if (!constraints.checked()) { + constraints.checkConstraints(0, 0, false); + } showMistakes = showMistakesCheck.isSelected(); constraints.highlightCells(showMistakes); + Animation animation = new Animation(); + animation.go(); } private void undoButtonClickEvent() { @@ -351,8 +440,7 @@ public class Main extends Application { private void stageWidthResizeEvent(Stage stage, GridPane gridPane) { stage.widthProperty().addListener((obs, oldVal, newVal) -> { if (newVal.doubleValue() < stage.getHeight()) { - isWider = false; - resizeGrid(gridPane.getLayoutX(), gridPane.getLayoutY(), gridPane.getWidth()); + resizeGrid(); } }); } @@ -360,20 +448,21 @@ public class Main extends Application { private void stageHeightResizeEvent(Stage stage, GridPane gridPane) { stage.heightProperty().addListener((obs, oldVal, newVal) -> { if (newVal.doubleValue() < stage.getWidth()) { - isWider = true; - resizeGrid(gridPane.getLayoutX(), gridPane.getLayoutY(), gridPane.getWidth()); + resizeGrid(); } }); } - public void resizeGrid(double gridX, double gridY, double gridWidth) { - double newValue = isWider ? scene.getHeight() : scene.getWidth(); + public void resizeGrid() { + double width = scene.getWidth() - 200; + double height = scene.getHeight() - 150; + double newValue = height < width ? height : width; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { Rectangle rectangle = gridSquares[i*N + j].getRectangle(); - rectangle.setWidth(newValue * GRID_PERCENTAGE / N); - rectangle.setHeight(newValue * GRID_PERCENTAGE / N); - gridSquares[i*N + j].resizeLines(newValue * GRID_PERCENTAGE / N); + rectangle.setWidth(newValue / N); + rectangle.setHeight(newValue / N); + gridSquares[i*N + j].resizeLines(newValue / N); } } } @@ -417,25 +506,10 @@ public class Main extends Application { private void clearButtonClickEvent(Button clearButton) { clearButton.setOnAction(e -> { if (!lastOperationClear()) { - clearing = true; - Alert alert = new Alert(AlertType.CONFIRMATION); - alert.setContentText("Are you sure you wish to clear the board?"); - alert.setTitle("Clearing Board."); - alert.showAndWait().ifPresent(type -> { - if (type == ButtonType.OK) { - for (TextField textField : gridNumbers) { - textField.setText(""); - } - undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers))); - } - });; - clearing = false; + clearGridAlert(); } else { - Alert alert = new Alert(AlertType.WARNING); - alert.setContentText("Nothing to clear on the board."); - alert.setTitle("Empty Board"); - alert.showAndWait(); + clearEmptyGridAlert(); } }); } @@ -467,12 +541,17 @@ public class Main extends Application { @Override public void start(Stage stage) throws Exception { VBox vBox = new VBox(); - scene = new Scene(vBox,500+50*N,500+50*N); + int width = 400 + 80 * N; + int height = 275 + 80 * N; + + scene = new Scene(vBox, width, height); + stage.setWidth(width); + stage.setHeight(height); vBox.setSpacing(10); vBox.setPadding(new Insets(20)); vBox.setAlignment(Pos.CENTER); - GridPane gridPane = setupGrid(); + GridPane gridPane = setupGrid(width - 200, height - 150); undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers))); fontSize = 18; @@ -484,6 +563,7 @@ public class Main extends Application { HBox gridHBox = new HBox(); gridHBox.getChildren().addAll(fontSizeVBox, gridPane, numbersVBox); gridHBox.setSpacing(20); + gridHBox.setAlignment(Pos.CENTER); HBox bottomHBox = setupBottomHBox(); @@ -492,8 +572,8 @@ public class Main extends Application { stageWidthResizeEvent(stage, gridPane); stageHeightResizeEvent(stage, gridPane); - stage.setMinWidth(500 + 50*N); - stage.setMinHeight(500 + 50*N); + stage.setMinWidth(width + 50); + stage.setMinHeight(height + 50); stage.setScene(scene); stage.setTitle("Mathdoku"); stage.show(); -- GitLab