From 31636e051aa767d4d239d69d465d8a99ef780601 Mon Sep 17 00:00:00 2001 From: Nimrod Abramovich <grumpydormin@gmail.com> Date: Wed, 11 Mar 2020 15:38:41 +0000 Subject: [PATCH] neatened up --- bin/coursework/Cage.class | Bin 5207 -> 5201 bytes bin/coursework/ConstraintsHandler.class | Bin 4379 -> 5128 bytes bin/coursework/GameState.class | Bin 871 -> 871 bytes bin/coursework/Main.class | Bin 22775 -> 22015 bytes src/coursework/ConstraintsHandler.java | 28 ++ src/coursework/Main.java | 371 +++++++++++------------- 6 files changed, 200 insertions(+), 199 deletions(-) diff --git a/bin/coursework/Cage.class b/bin/coursework/Cage.class index f93cf6cd92afb4721aa5581143ec6bcac4afbf0f..70a114efa9b35343e040b2214c124d1c0de03eb7 100644 GIT binary patch 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 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 diff --git a/bin/coursework/ConstraintsHandler.class b/bin/coursework/ConstraintsHandler.class index 3925deed9d581baf2a3e504ec054b790a6711334..d80f886ace8cb45794c9249a022cb37de2a66d45 100644 GIT binary patch delta 1883 zcmbQO)S<z3>ff$?3=9k=4Cgj-)w0(MCTFB3XNPCzIp^o4WR_&+=W#JGGHm8y*upT6 zk%12^>ztaCQ|wlnlLM04#>223Bqa)w%Fin<DN4-DD{(C<$}cMBWZ22Do1I}7BZELz zVp*boPGVlVesE=RNop<+!ybmcj10{Ar6r6EqCQ~h%<z2ufTGO2lHih})WlqC4u<`V z4D6Blr3&RBha6-$%+7F#kwF-u7)31)!x4scj124rAniGMj0~J5sTCz|nW;G`j0_5s z9hnrA*%{av8Mu;Db8;Y#V`N~8j$&lsNCi1HEHQ_j;pF62_9#Yy$q(3N<Rteph-_sL z(-M%}%OJ6pK}u^kgG}Uh2Dz;a@>&9to2585Gs;UbFf*_*Ffe#A+wNwFi`>qT;Kyvn zx}3pOYYT&zG{@w(oO&!A3;&;<tiUCoslZ^!V9a2|V9H?3V8LL@V9%h>;K5+Qpvu6& zU<WaVL5)G30R+4l{2BZh7#WxtJQ#`@0vVVXxELH5N*GERm>Coplo-kw${AP~cp0o2 zDj572SQ#oA7#MgM7$K@A`|-##s!z`2QJwsjt4#^7BSl#`GNdPe;M9h=^BA{$x&nh2 zgE50QgDHa#g9U>hgFS->g9k$(4tM%uac2uL?wstyqX>4Te*H=YW(F<>28QWcTNvbb zGPE)>%wy<f^n>ua85yitmoqp@vhHN)XJk0QFx84hl4Tpi^hhhteP$fYX6(xuWF<L8 z+4aoWMA@V{GGr1KFmOt;_$_DPZDD5=Wf$dG`2P_|_iRRnS^szIZey5l#-a;0fMcH- zJG0qjSzf1lFNP=vUxsLg0EP&LD28x`6ov$bEQUmeMusGY9)?7QX$-005C~%60J#(% zQ`4a_#lSF~0TdQY415e742u{RGcYq~Fc>i`VOY$-!r;Ilz_66TkAaOLi$RBB8ABig z3qvCVH&~37A(nw*@;zQ7MzP6)d@l7x49pD73=9m?%(lxJgtfLXD1kj?#LOJh!o(=U zvGD)9jSLJ7%nT|F3=BdHEDQ_`84RopnG8Y<84OYk*<fcXK#YJpQyS__CI$&`l3@Z_ z%D~RR^oN0!k)MHyp@AWifssLwfuWuO(*ZIZ8PW+xEVvzz$H2;v&mhE*#~{T}h{FM( z&;g}r91e(qIzW{Hivyq`zyc3}$#wi<SwajY3{ni`IP8PvARP8JL+!(69n`-F>m~_^ zSqU*zF-S4g;;;>$?<NNb#4$=vUN4YdF8~Q-h9Cwe21W)3263(J44Y;$2x)C+*gBJe zdlSPBp?%vJ4j>|!4;+!*415fI3}Oruz_x>OIs=0^G;(9XiGfj!feBPdL(T7GU}9ip zU|`S&l|+$NEc@(0sY$Y4l10YIM|&GXqEO~GhU{4ktjudbiAr|i{}(K4zy^U*l^9s> zWCme|DGc%qQyCN)CNpR<%m7;svWI~|8)~^Q10TathGPtj;PfQI!2F+qkAan)fsuic zk)7c<1A`C~0~4r*fViuk;T8iE11AFmgA*uW!yRS-aaW`jBuBC>XAqI(5M?tqV-;nc z33enKqbQpw`@;XPq0YUC<Xkxhb_NE9ISj%Ka~aeb<}v6n%xBPJn9E?nFo(f`VKLa* zkPMOT1b4S8!wH6y42%rw4D1Z27y=o<*^t48ffdCEiVO_@83Y+P*%=tw8BT-zqzLxe cX$A&frvD6_2)`;aFfcGOoMB*KU}88601z2bfdBvi delta 1053 zcmeCsn61Qh>ff$?3=9k=44XG{)v`}s#1X;BJNY+<442AY29d1{Vp;+!lNC9I8C5o$ za&Bf+mSJFKU}Iol@L{&y%@7y4ogu-G*^G5LgPGPA1~F*?whU3$$?JHuSq0b@{y#a{ zl3PAqk-?C`gu#fxjKP?}lEIY0fkB_ai@}0Hm4Si54q_IA8iP6m2>3AgGx#wuGB7cC zF%&ZdGB7c4F*q@lFqASdGbl1BF_bZsGq5o5GT1UyF!(XBGE_1!Fz_%if>cf3&#lO) zG5I0)YDK(m6lE1)o4kfc7wW>hJo1@}3|<T-4BiZ83_c8&41Np_3?2+#41qXY=!?aL zEyTExp=I(xZh5d9RVT0F<x*Y6z|6qKz`!s=YYT(?PKH)ShItHqjD8SaHzR`;>v9IC z$v1grc;zHHMcMVt*hJZ+1=uDt@`-Xklw{q>Fq@HK*8g3T75PHyy&0ky{1~Dc0vRG0 zq8Y*&QW+8$vKbN?ni!H8dKnTKrZc31{S(B%0kRPu;xnKj&cHB(0pv3#20n&PhD8jE z8JHO~7>pT~Ff3+ZVQ^p&WLV1J$H2yr&7i}uj3JPLg`tUo8!X1k5X-<Y`3s*BqxfWX zeizje24)6k1_lOMX4~ZqB3fG*lt9TsCc%iAIi!V&Q3jMU-c0V}7t0Z5$Y79R$OgMh z0ip-)E?KC%m>8tMam@s>g@K)c=??=dqW}XFLjyx310#bV0|Nu5g)#zc8PW+xEXWq} z34kojV~}Ae#9<-G`=F$U!@?Lm7Q%eUg6u=Eg(VC!4COd1gr#*H7B=It5avT<3;6`a itb`e=7-Se~aaf4Yhm+$3;}}&Y?-fjEWnf@p*aQH&Z>i}3 diff --git a/bin/coursework/GameState.class b/bin/coursework/GameState.class index 05a8e904dce51e954e51bf717fb058b235294275..7da95ce3340cd26d28aaa90c45379d71f8c06b7d 100644 GIT binary patch delta 13 UcmaFP_MC0QOD0Ci$*-7d0V&M|i~s-t delta 13 UcmaFP_MC0QOD0B@$*-7d0V)IqmjD0& diff --git a/bin/coursework/Main.class b/bin/coursework/Main.class index 7f230ff2765f64c4bfeaa4d51e685ceb5a8f0205..eebd54f556d3480d151a72b3fd5448dad7431061 100644 GIT binary patch delta 10741 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 I^IHZ<0Dp`YH2?qr delta 11594 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 diff --git a/src/coursework/ConstraintsHandler.java b/src/coursework/ConstraintsHandler.java index 3eb2306..be56672 100644 --- a/src/coursework/ConstraintsHandler.java +++ b/src/coursework/ConstraintsHandler.java @@ -135,4 +135,32 @@ public class ConstraintsHandler { } } + public void checkWinCondition() { + if (checkCellsFull() && checkConstraintErrors()) { + // win condition fulfilled + // animation and pop up + System.out.println("You won"); + } + } + + private boolean checkCellsFull() { + for (TextField textField : gridNumbers) { + if (!textField.getText().equals("")) { + return false; + } + } + return true; + } + + private boolean checkConstraintErrors() { + for (boolean[] cellErrors : gridErrors) { + for (boolean errorVal : cellErrors) { + if (errorVal) { + return false; + } + } + } + return true; + } + } diff --git a/src/coursework/Main.java b/src/coursework/Main.java index 087ea75..3416de1 100644 --- a/src/coursework/Main.java +++ b/src/coursework/Main.java @@ -34,7 +34,7 @@ import javafx.stage.Stage; public class Main extends Application { - final static public int N = 6; + final static public int N = 5; final private double GRID_PERCENTAGE = 0.75; private Scene scene; @@ -62,7 +62,7 @@ public class Main extends Application { private Button undoButton; private Button redoButton; - + ////////////////////////////////////////////////////////////////////////////////// public static Square[] getGridSquares() { return gridSquares; } @@ -86,11 +86,12 @@ public class Main extends Application { public static boolean[][] getGridErrors() { return gridErrors; } + ////////////////////////////////////////////////////////////////////////////////// private GridPane setupGrid() { GridPane gridPane = new GridPane(); gridPane.setAlignment(Pos.CENTER); - double size = scene.getWidth() * GRID_PERCENTAGE / N; + double size = (scene.getWidth() * GRID_PERCENTAGE) / N; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { @@ -124,45 +125,6 @@ public class Main extends Application { return gridPane; } - private void textFieldClickEvent(int i, int j) { - if (!clearing && !undoing) { - undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers))); - if (undoButton.isDisabled()) { - undoButton.setDisable(false); - } - } - constraints.checkConstraints(j, i, showMistakes);; - checkWinCondition(); - } - - private void checkWinCondition() { - if (checkCellsFull() && checkConstraintErrors()) { - // win condition fulfilled - // animation and pop up - System.out.println("You won"); - } - } - - private boolean checkCellsFull() { - for (TextField textField : gridNumbers) { - if (!textField.getText().equals("")) { - return false; - } - } - return true; - } - - private boolean checkConstraintErrors() { - for (boolean[] cellErrors : gridErrors) { - for (boolean errorVal : cellErrors) { - if (errorVal) { - return false; - } - } - } - return true; - } - private VBox setupGridVBox(Square square, int i, int j) { VBox vbox = new VBox(); Label cageInfoLabel = new Label(""); @@ -213,27 +175,11 @@ public class Main extends Application { topHBox.getChildren().addAll(loadGameFileButton, showMistakesCheck, loadGameTextInputButton); showMistakesCheck.selectedProperty().addListener((obs, oldVal, newVal) -> { - showMistakes = showMistakesCheck.isSelected(); - constraints.highlightCells(showMistakes); + showMistakesCheckEvent(showMistakesCheck); }); loadGameFileButton.setOnAction(e -> { - try { - FileChooser fileChooser = new FileChooser(); - fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Text Files", "*.txt")); - File selectedFile = fileChooser.showOpenDialog(stage); - BufferedReader file = new BufferedReader(new FileReader(selectedFile)); - - String line; - while ((line = file.readLine()) != null) { - createNewCage(line); - } - file.close(); - } catch (FileNotFoundException e1) { - e1.printStackTrace(); - } catch (IOException e2) { - e2.printStackTrace(); - } + loadFileButtonClickEvent(); }); return topHBox; @@ -275,29 +221,10 @@ public class Main extends Application { redoButton = new Button("", new ImageView(new Image("file:Images/redo_icon.png"))); Button clearButton = new Button("Clear"); undoButton.setOnAction(e -> { - undoing = true; - - redoStack.push(undoStack.pop()); - updateGameState(undoStack.peek()); - - if (!redoStack.empty()) { - redoButton.setDisable(false); - } - if (undoStack.size() == 1) { - undoButton.setDisable(true); - } - undoing = false; + undoButtonClickEvent(); }); redoButton.setOnAction(e -> { - GameState gameState = redoStack.pop(); - updateGameState(gameState); - - if (!undoStack.empty()) { - undoButton.setDisable(false); - } - if (redoStack.empty()) { - redoButton.setDisable(true); - } + redoButtonClickEvent(); }); undoButton.setDisable(true); @@ -310,6 +237,147 @@ public class Main extends Application { return bottomHBox; } + private VBox setupNumbersVBox() { + VBox vbox = new VBox(); + for (int i = 1; i <= N; i++) { + Button button = new Button(i + ""); + double cellWidth = gridSquares[0].getRectangle().getWidth() / 2; + double fontSize = cellWidth * 0.4; + + button.setPrefSize(cellWidth, cellWidth); + button.setMaxSize(150, 150); + button.setStyle("-fx-font-size:"+fontSize+"pt"); + button.setOnAction(e -> { + numbersButtonClickEvent(button); + }); + vbox.getChildren().add(button); + } + vbox.setSpacing(10); + vbox.setAlignment(Pos.CENTER); + 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.setAlignment(Pos.CENTER); + return vbox; + } + + private Button setupButton(String name, int size) { + Button button = new Button(name); + button.setStyle("-fx-font-size:" + size + "px;"); + button.setOnAction(e -> { + changeFontSizeEvent(size); + }); + return button; + } + + /////////////////////////////////////////////////////////// + private void loadFileButtonClickEvent() { + try { + FileChooser fileChooser = new FileChooser(); + fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Text Files", "*.txt")); + File selectedFile = fileChooser.showOpenDialog(stage); + BufferedReader file = new BufferedReader(new FileReader(selectedFile)); + + String line; + while ((line = file.readLine()) != null) { + createNewCage(line); + } + file.close(); + } catch (FileNotFoundException e1) { + e1.printStackTrace(); + } catch (IOException e2) { + e2.printStackTrace(); + } + } + + private void showMistakesCheckEvent(CheckBox showMistakesCheck) { + showMistakes = showMistakesCheck.isSelected(); + constraints.highlightCells(showMistakes); + } + + private void undoButtonClickEvent() { + undoing = true; + + redoStack.push(undoStack.pop()); + updateGameState(undoStack.peek()); + + if (!redoStack.empty()) { + redoButton.setDisable(false); + } + if (undoStack.size() == 1) { + undoButton.setDisable(true); + } + undoing = false; + } + + private void redoButtonClickEvent() { + GameState gameState = redoStack.pop(); + updateGameState(gameState); + + if (!undoStack.empty()) { + undoButton.setDisable(false); + } + if (redoStack.empty()) { + redoButton.setDisable(true); + } + } + + private void numbersButtonClickEvent(Button button) { + if (previousSquare != null) { + for (int i = 0; i < gridSquares.length; i++) { + if (previousSquare.equals(gridSquares[i])) { + gridNumbers[i].setText(button.getText()); + } + } + } + } + + private void changeFontSizeEvent(int size) { + fontSize = size; + for (TextField textField : gridNumbers) { + textField.setStyle("-fx-focus-color: transparent; -fx-text-box-border: transparent;" + + "-fx-background-color: -fx-text-box-border, -fx-control-inner-background;" + + "-fx-font-size:" + size*1.8 + ";"); + } + for (Label label : cageLabels) { + label.setStyle("-fx-font-size:" + size*0.9 + ";"); + } + } + + 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()); + } + }); + } + + 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()); + } + }); + } + + public void resizeGrid(double gridX, double gridY, double gridWidth) { + double newValue = isWider ? scene.getHeight() : scene.getWidth(); + 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); + } + } + } + private void paneClickSquareEvent(int i, int j, Square square) { gridBoxes[i*N + j].addEventHandler(MouseEvent.MOUSE_CLICKED, e -> { if (previousPane != null) { @@ -372,6 +440,17 @@ public class Main extends Application { }); } + private void textFieldClickEvent(int i, int j) { + if (!clearing && !undoing) { + undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers))); + if (undoButton.isDisabled()) { + undoButton.setDisable(false); + } + } + constraints.checkConstraints(j, i, showMistakes);; + constraints.checkWinCondition(); + } + private boolean lastOperationClear() { GameState gameState = undoStack.peek(); boolean emptyGrid = true; @@ -383,123 +462,12 @@ public class Main extends Application { return emptyGrid; } - 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()); - } - }); - } - - 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()); - } - }); - } - - public void resizeGrid(double gridX, double gridY, double gridWidth) { - double newValue = isWider ? scene.getHeight() : scene.getWidth(); - 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); - } - } - } - - private HBox setupCenterHBox() { - HBox hbox = new HBox(); - for (int i = 1; i <= N; i++) { - Button button = new Button(i + ""); - double cellWidth = gridSquares[0].getRectangle().getWidth() / 2; - double fontSize = cellWidth * 0.4; - - button.setPrefSize(cellWidth, cellWidth); - button.setMaxSize(150, 150); - button.setStyle("-fx-font-size:"+fontSize+"pt"); - button.setOnAction(e -> { - numbersButtonClickEvent(button); - }); - hbox.getChildren().add(button); - } - hbox.setSpacing(10); - hbox.setAlignment(Pos.CENTER); - return hbox; - } - - private void numbersButtonClickEvent(Button button) { - if (previousSquare != null) { - for (int i = 0; i < gridSquares.length; i++) { - if (previousSquare.equals(gridSquares[i])) { - gridNumbers[i].setText(button.getText()); - } - } - } - } - - private HBox setupFontSizeHBox() { - HBox hbox = new HBox(); - Button tiny = new Button("Tiny"); - Button small = new Button("Small"); - Button medium = new Button("Medium"); - Button large = new Button("Large"); - Button huge = new Button("Huge"); - - - - tiny.setStyle("-fx-font-size:12px;"); - tiny.setOnAction(e -> { - changeFontSize(10); - }); - - small.setStyle("-fx-font-size:16px;"); - small.setOnAction(e -> { - changeFontSize(12); - }); - - medium.setStyle("-fx-font-size:20px;"); - medium.setOnAction(e -> { - changeFontSize(18); - }); - - large.setStyle("-fx-font-size:24px;"); - large.setOnAction(e -> { - changeFontSize(22); - }); - - huge.setStyle("-fx-font-size:28px;"); - huge.setOnAction(e -> { - changeFontSize(26); - }); - - hbox.getChildren().addAll(tiny, small, medium, large, huge); - hbox.setSpacing(10); - hbox.setAlignment(Pos.CENTER); - return hbox; - } - - private void changeFontSize(int size) { - fontSize = size; - for (TextField textField : gridNumbers) { - textField.setStyle("-fx-focus-color: transparent; -fx-text-box-border: transparent;" - + "-fx-background-color: -fx-text-box-border, -fx-control-inner-background;" - + "-fx-font-size:" + size*1.8 + ";"); - } - for (Label label : cageLabels) { - label.setStyle("-fx-font-size:" + size*0.9 + ";"); - } - } + //////////////////////////////////////////////////////// @Override public void start(Stage stage) throws Exception { VBox vBox = new VBox(); - scene = new Scene(vBox,400+50*N,450+50*N); + scene = new Scene(vBox,500+50*N,500+50*N); vBox.setSpacing(10); vBox.setPadding(new Insets(20)); vBox.setAlignment(Pos.CENTER); @@ -508,19 +476,24 @@ public class Main extends Application { undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers))); fontSize = 18; - changeFontSize(fontSize); - HBox fontSizeHBox = setupFontSizeHBox(); + changeFontSizeEvent(fontSize); HBox topHBox = setupTopHBox(); - HBox centerHBox = setupCenterHBox(); + + VBox fontSizeVBox = setupFontSizeHBox(); + VBox numbersVBox = setupNumbersVBox(); + HBox gridHBox = new HBox(); + gridHBox.getChildren().addAll(fontSizeVBox, gridPane, numbersVBox); + gridHBox.setSpacing(20); + HBox bottomHBox = setupBottomHBox(); - vBox.getChildren().addAll(topHBox, gridPane, centerHBox, bottomHBox, fontSizeHBox); + vBox.getChildren().addAll(topHBox, gridHBox, bottomHBox); stageWidthResizeEvent(stage, gridPane); stageHeightResizeEvent(stage, gridPane); stage.setMinWidth(500 + 50*N); - stage.setMinHeight(500 + 50*(N+1)); + stage.setMinHeight(500 + 50*N); stage.setScene(scene); stage.setTitle("Mathdoku"); stage.show(); -- GitLab