JavaFX GridPane Object Alignment









up vote
0
down vote

favorite












I am trying to use JavaFX to create a scene with the program's title positioned at the top-center, and buttons in a vertical line along the left side of the scene. However, both of these elements are displayed clustered up in the top-right of the scene, instead of where I want them to be.



How can I get these elements to be displayed where I want them to?



Here is how I try to set the program title's position:



 grid.add(gameTitle, 0, 0);
GridPane.setHalignment(gameTitle, HPos.CENTER);
GridPane.setValignment(gameTitle, VPos.TOP);


I try to set the VBox object similarly:



 grid.getChildren().add(buttonBox);
GridPane.setHalignment(buttonBox, HPos.LEFT);
GridPane.setValignment(buttonBox, VPos.CENTER);


This is what is displayed:
This is what is displayed



My entire MainMenu class. (This class is called in my Main class to construct the scene):



package scenes;

import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.application.Platform;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.scene.text.Font;
import javafx.scene.text.Text;

public class MainMenu
public Pane getMainMenuPane()
// Create the scene grid
GridPane grid = new GridPane();
grid.setHgap(10);
grid.setVgap(10);

// Set the game title to the top center
Text gameTitle = new Text("Bandit King");
Font titleFont = new Font(75);
gameTitle.setFont(titleFont);
//
grid.add(gameTitle, 0, 0);
GridPane.setHalignment(gameTitle, HPos.CENTER);
GridPane.setValignment(gameTitle, VPos.TOP);

// Create Button objects and put in VBox
Button buttArr = makeButtons();
VBox buttonBox = new VBox();
buttonBox.getChildren().addAll(buttArr);
buttonBox.setSpacing(10);

// add Button VBox to GridPane
grid.getChildren().add(buttonBox);
GridPane.setHalignment(buttonBox, HPos.LEFT);
GridPane.setValignment(buttonBox, VPos.CENTER);

return (Pane) grid;


private Button makeButtons()
// Create buttons
Button start = new Button("Start a New Game");
Button load = new Button("Load a Saved Game");
Button exit = new Button("Exit the Game");

// set Button actions
start.setOnAction( a ->
System.out.println("WIP- start game.");
);
load.setOnAction( a ->
System.out.println("WIP- load game");
);
exit.setOnAction( a ->
Platform.exit();
System.exit(0);
);

// return Button array
Button buttArr = start, load, exit;
return buttArr;






My Main class (Displays the scene):



package central;

import javafx.stage.Stage;
import scenes.*;
import controllers.*;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;

public class Main extends Application

// Get scene panes
private static Pane mainMenu = new MainMenu().getMainMenuPane();

// Create SceneController object.
private static Scene scene = new Scene(mainMenu, 1600, 900);
public static SceneController SceneControl = new SceneController(scene);

@Override
public void start(Stage stage)
stage.setTitle("Bandit King");
stage.setScene(scene);
stage.show();


public static void main(String args)
launch(args);













share|improve this question



























    up vote
    0
    down vote

    favorite












    I am trying to use JavaFX to create a scene with the program's title positioned at the top-center, and buttons in a vertical line along the left side of the scene. However, both of these elements are displayed clustered up in the top-right of the scene, instead of where I want them to be.



    How can I get these elements to be displayed where I want them to?



    Here is how I try to set the program title's position:



     grid.add(gameTitle, 0, 0);
    GridPane.setHalignment(gameTitle, HPos.CENTER);
    GridPane.setValignment(gameTitle, VPos.TOP);


    I try to set the VBox object similarly:



     grid.getChildren().add(buttonBox);
    GridPane.setHalignment(buttonBox, HPos.LEFT);
    GridPane.setValignment(buttonBox, VPos.CENTER);


    This is what is displayed:
    This is what is displayed



    My entire MainMenu class. (This class is called in my Main class to construct the scene):



    package scenes;

    import javafx.scene.layout.GridPane;
    import javafx.scene.layout.VBox;
    import javafx.application.Platform;
    import javafx.geometry.HPos;
    import javafx.geometry.VPos;
    import javafx.scene.control.Button;
    import javafx.scene.layout.Pane;
    import javafx.scene.text.Font;
    import javafx.scene.text.Text;

    public class MainMenu
    public Pane getMainMenuPane()
    // Create the scene grid
    GridPane grid = new GridPane();
    grid.setHgap(10);
    grid.setVgap(10);

    // Set the game title to the top center
    Text gameTitle = new Text("Bandit King");
    Font titleFont = new Font(75);
    gameTitle.setFont(titleFont);
    //
    grid.add(gameTitle, 0, 0);
    GridPane.setHalignment(gameTitle, HPos.CENTER);
    GridPane.setValignment(gameTitle, VPos.TOP);

    // Create Button objects and put in VBox
    Button buttArr = makeButtons();
    VBox buttonBox = new VBox();
    buttonBox.getChildren().addAll(buttArr);
    buttonBox.setSpacing(10);

    // add Button VBox to GridPane
    grid.getChildren().add(buttonBox);
    GridPane.setHalignment(buttonBox, HPos.LEFT);
    GridPane.setValignment(buttonBox, VPos.CENTER);

    return (Pane) grid;


    private Button makeButtons()
    // Create buttons
    Button start = new Button("Start a New Game");
    Button load = new Button("Load a Saved Game");
    Button exit = new Button("Exit the Game");

    // set Button actions
    start.setOnAction( a ->
    System.out.println("WIP- start game.");
    );
    load.setOnAction( a ->
    System.out.println("WIP- load game");
    );
    exit.setOnAction( a ->
    Platform.exit();
    System.exit(0);
    );

    // return Button array
    Button buttArr = start, load, exit;
    return buttArr;






    My Main class (Displays the scene):



    package central;

    import javafx.stage.Stage;
    import scenes.*;
    import controllers.*;
    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.layout.Pane;

    public class Main extends Application

    // Get scene panes
    private static Pane mainMenu = new MainMenu().getMainMenuPane();

    // Create SceneController object.
    private static Scene scene = new Scene(mainMenu, 1600, 900);
    public static SceneController SceneControl = new SceneController(scene);

    @Override
    public void start(Stage stage)
    stage.setTitle("Bandit King");
    stage.setScene(scene);
    stage.show();


    public static void main(String args)
    launch(args);













    share|improve this question

























      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











      I am trying to use JavaFX to create a scene with the program's title positioned at the top-center, and buttons in a vertical line along the left side of the scene. However, both of these elements are displayed clustered up in the top-right of the scene, instead of where I want them to be.



      How can I get these elements to be displayed where I want them to?



      Here is how I try to set the program title's position:



       grid.add(gameTitle, 0, 0);
      GridPane.setHalignment(gameTitle, HPos.CENTER);
      GridPane.setValignment(gameTitle, VPos.TOP);


      I try to set the VBox object similarly:



       grid.getChildren().add(buttonBox);
      GridPane.setHalignment(buttonBox, HPos.LEFT);
      GridPane.setValignment(buttonBox, VPos.CENTER);


      This is what is displayed:
      This is what is displayed



      My entire MainMenu class. (This class is called in my Main class to construct the scene):



      package scenes;

      import javafx.scene.layout.GridPane;
      import javafx.scene.layout.VBox;
      import javafx.application.Platform;
      import javafx.geometry.HPos;
      import javafx.geometry.VPos;
      import javafx.scene.control.Button;
      import javafx.scene.layout.Pane;
      import javafx.scene.text.Font;
      import javafx.scene.text.Text;

      public class MainMenu
      public Pane getMainMenuPane()
      // Create the scene grid
      GridPane grid = new GridPane();
      grid.setHgap(10);
      grid.setVgap(10);

      // Set the game title to the top center
      Text gameTitle = new Text("Bandit King");
      Font titleFont = new Font(75);
      gameTitle.setFont(titleFont);
      //
      grid.add(gameTitle, 0, 0);
      GridPane.setHalignment(gameTitle, HPos.CENTER);
      GridPane.setValignment(gameTitle, VPos.TOP);

      // Create Button objects and put in VBox
      Button buttArr = makeButtons();
      VBox buttonBox = new VBox();
      buttonBox.getChildren().addAll(buttArr);
      buttonBox.setSpacing(10);

      // add Button VBox to GridPane
      grid.getChildren().add(buttonBox);
      GridPane.setHalignment(buttonBox, HPos.LEFT);
      GridPane.setValignment(buttonBox, VPos.CENTER);

      return (Pane) grid;


      private Button makeButtons()
      // Create buttons
      Button start = new Button("Start a New Game");
      Button load = new Button("Load a Saved Game");
      Button exit = new Button("Exit the Game");

      // set Button actions
      start.setOnAction( a ->
      System.out.println("WIP- start game.");
      );
      load.setOnAction( a ->
      System.out.println("WIP- load game");
      );
      exit.setOnAction( a ->
      Platform.exit();
      System.exit(0);
      );

      // return Button array
      Button buttArr = start, load, exit;
      return buttArr;






      My Main class (Displays the scene):



      package central;

      import javafx.stage.Stage;
      import scenes.*;
      import controllers.*;
      import javafx.application.Application;
      import javafx.scene.Scene;
      import javafx.scene.layout.Pane;

      public class Main extends Application

      // Get scene panes
      private static Pane mainMenu = new MainMenu().getMainMenuPane();

      // Create SceneController object.
      private static Scene scene = new Scene(mainMenu, 1600, 900);
      public static SceneController SceneControl = new SceneController(scene);

      @Override
      public void start(Stage stage)
      stage.setTitle("Bandit King");
      stage.setScene(scene);
      stage.show();


      public static void main(String args)
      launch(args);













      share|improve this question















      I am trying to use JavaFX to create a scene with the program's title positioned at the top-center, and buttons in a vertical line along the left side of the scene. However, both of these elements are displayed clustered up in the top-right of the scene, instead of where I want them to be.



      How can I get these elements to be displayed where I want them to?



      Here is how I try to set the program title's position:



       grid.add(gameTitle, 0, 0);
      GridPane.setHalignment(gameTitle, HPos.CENTER);
      GridPane.setValignment(gameTitle, VPos.TOP);


      I try to set the VBox object similarly:



       grid.getChildren().add(buttonBox);
      GridPane.setHalignment(buttonBox, HPos.LEFT);
      GridPane.setValignment(buttonBox, VPos.CENTER);


      This is what is displayed:
      This is what is displayed



      My entire MainMenu class. (This class is called in my Main class to construct the scene):



      package scenes;

      import javafx.scene.layout.GridPane;
      import javafx.scene.layout.VBox;
      import javafx.application.Platform;
      import javafx.geometry.HPos;
      import javafx.geometry.VPos;
      import javafx.scene.control.Button;
      import javafx.scene.layout.Pane;
      import javafx.scene.text.Font;
      import javafx.scene.text.Text;

      public class MainMenu
      public Pane getMainMenuPane()
      // Create the scene grid
      GridPane grid = new GridPane();
      grid.setHgap(10);
      grid.setVgap(10);

      // Set the game title to the top center
      Text gameTitle = new Text("Bandit King");
      Font titleFont = new Font(75);
      gameTitle.setFont(titleFont);
      //
      grid.add(gameTitle, 0, 0);
      GridPane.setHalignment(gameTitle, HPos.CENTER);
      GridPane.setValignment(gameTitle, VPos.TOP);

      // Create Button objects and put in VBox
      Button buttArr = makeButtons();
      VBox buttonBox = new VBox();
      buttonBox.getChildren().addAll(buttArr);
      buttonBox.setSpacing(10);

      // add Button VBox to GridPane
      grid.getChildren().add(buttonBox);
      GridPane.setHalignment(buttonBox, HPos.LEFT);
      GridPane.setValignment(buttonBox, VPos.CENTER);

      return (Pane) grid;


      private Button makeButtons()
      // Create buttons
      Button start = new Button("Start a New Game");
      Button load = new Button("Load a Saved Game");
      Button exit = new Button("Exit the Game");

      // set Button actions
      start.setOnAction( a ->
      System.out.println("WIP- start game.");
      );
      load.setOnAction( a ->
      System.out.println("WIP- load game");
      );
      exit.setOnAction( a ->
      Platform.exit();
      System.exit(0);
      );

      // return Button array
      Button buttArr = start, load, exit;
      return buttArr;






      My Main class (Displays the scene):



      package central;

      import javafx.stage.Stage;
      import scenes.*;
      import controllers.*;
      import javafx.application.Application;
      import javafx.scene.Scene;
      import javafx.scene.layout.Pane;

      public class Main extends Application

      // Get scene panes
      private static Pane mainMenu = new MainMenu().getMainMenuPane();

      // Create SceneController object.
      private static Scene scene = new Scene(mainMenu, 1600, 900);
      public static SceneController SceneControl = new SceneController(scene);

      @Override
      public void start(Stage stage)
      stage.setTitle("Bandit King");
      stage.setScene(scene);
      stage.show();


      public static void main(String args)
      launch(args);










      java user-interface javafx graphics gridpane






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 11 at 22:09

























      asked Nov 11 at 21:44









      LuminousNutria

      406120




      406120






















          2 Answers
          2






          active

          oldest

          votes

















          up vote
          2
          down vote



          accepted










          The default cell you add the children of a GridPane to is (0, 0) which is what you do in this line:



          grid.getChildren().add(buttonBox);


          you need to change this to



          grid.add(buttonBox, 0, 1);


          to set the row index to 1. (There are alternatives to assigning the row index this way, but this is the most convenient option in this case.)



          This won't result in the first column taking the full width of the GridPane though. If you also want the first column to take all the width available, you need to specify this by adding ColumnConstraints:



          ColumnConstraints constraints = new ColumnConstraints();
          constraints.setHgrow(Priority.ALWAYS);

          grid.getColumnConstraints().add(constraints);





          share|improve this answer



























            up vote
            0
            down vote













            As far as what I noticed, you added all the nodes in a column and set there positions, but you did not specify how much the column needs to be stretched. GridPane column will not stretch automatically by itself unless specified.



            You can debug your program, by enabling the gridLinesVisible of GridPane property to true.



            grid.setGridLinesVisible(true);


            You need to specify the columnConstraints, to let the GridPane column stretch to the available width.



            ColumnConstraints constraint = new ColumnConstraints();
            constraint.setHgrow(Priority.ALWAYS);
            grid.getColumnConstraints().add(constraint);





            share|improve this answer




















              Your Answer






              StackExchange.ifUsing("editor", function ()
              StackExchange.using("externalEditor", function ()
              StackExchange.using("snippets", function ()
              StackExchange.snippets.init();
              );
              );
              , "code-snippets");

              StackExchange.ready(function()
              var channelOptions =
              tags: "".split(" "),
              id: "1"
              ;
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function()
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled)
              StackExchange.using("snippets", function()
              createEditor();
              );

              else
              createEditor();

              );

              function createEditor()
              StackExchange.prepareEditor(
              heartbeatType: 'answer',
              convertImagesToLinks: true,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: 10,
              bindNavPrevention: true,
              postfix: "",
              imageUploader:
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              ,
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              );



              );













              draft saved

              draft discarded


















              StackExchange.ready(
              function ()
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53253552%2fjavafx-gridpane-object-alignment%23new-answer', 'question_page');

              );

              Post as a guest















              Required, but never shown

























              2 Answers
              2






              active

              oldest

              votes








              2 Answers
              2






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes








              up vote
              2
              down vote



              accepted










              The default cell you add the children of a GridPane to is (0, 0) which is what you do in this line:



              grid.getChildren().add(buttonBox);


              you need to change this to



              grid.add(buttonBox, 0, 1);


              to set the row index to 1. (There are alternatives to assigning the row index this way, but this is the most convenient option in this case.)



              This won't result in the first column taking the full width of the GridPane though. If you also want the first column to take all the width available, you need to specify this by adding ColumnConstraints:



              ColumnConstraints constraints = new ColumnConstraints();
              constraints.setHgrow(Priority.ALWAYS);

              grid.getColumnConstraints().add(constraints);





              share|improve this answer
























                up vote
                2
                down vote



                accepted










                The default cell you add the children of a GridPane to is (0, 0) which is what you do in this line:



                grid.getChildren().add(buttonBox);


                you need to change this to



                grid.add(buttonBox, 0, 1);


                to set the row index to 1. (There are alternatives to assigning the row index this way, but this is the most convenient option in this case.)



                This won't result in the first column taking the full width of the GridPane though. If you also want the first column to take all the width available, you need to specify this by adding ColumnConstraints:



                ColumnConstraints constraints = new ColumnConstraints();
                constraints.setHgrow(Priority.ALWAYS);

                grid.getColumnConstraints().add(constraints);





                share|improve this answer






















                  up vote
                  2
                  down vote



                  accepted







                  up vote
                  2
                  down vote



                  accepted






                  The default cell you add the children of a GridPane to is (0, 0) which is what you do in this line:



                  grid.getChildren().add(buttonBox);


                  you need to change this to



                  grid.add(buttonBox, 0, 1);


                  to set the row index to 1. (There are alternatives to assigning the row index this way, but this is the most convenient option in this case.)



                  This won't result in the first column taking the full width of the GridPane though. If you also want the first column to take all the width available, you need to specify this by adding ColumnConstraints:



                  ColumnConstraints constraints = new ColumnConstraints();
                  constraints.setHgrow(Priority.ALWAYS);

                  grid.getColumnConstraints().add(constraints);





                  share|improve this answer












                  The default cell you add the children of a GridPane to is (0, 0) which is what you do in this line:



                  grid.getChildren().add(buttonBox);


                  you need to change this to



                  grid.add(buttonBox, 0, 1);


                  to set the row index to 1. (There are alternatives to assigning the row index this way, but this is the most convenient option in this case.)



                  This won't result in the first column taking the full width of the GridPane though. If you also want the first column to take all the width available, you need to specify this by adding ColumnConstraints:



                  ColumnConstraints constraints = new ColumnConstraints();
                  constraints.setHgrow(Priority.ALWAYS);

                  grid.getColumnConstraints().add(constraints);






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Nov 11 at 23:19









                  fabian

                  49.9k115170




                  49.9k115170






















                      up vote
                      0
                      down vote













                      As far as what I noticed, you added all the nodes in a column and set there positions, but you did not specify how much the column needs to be stretched. GridPane column will not stretch automatically by itself unless specified.



                      You can debug your program, by enabling the gridLinesVisible of GridPane property to true.



                      grid.setGridLinesVisible(true);


                      You need to specify the columnConstraints, to let the GridPane column stretch to the available width.



                      ColumnConstraints constraint = new ColumnConstraints();
                      constraint.setHgrow(Priority.ALWAYS);
                      grid.getColumnConstraints().add(constraint);





                      share|improve this answer
























                        up vote
                        0
                        down vote













                        As far as what I noticed, you added all the nodes in a column and set there positions, but you did not specify how much the column needs to be stretched. GridPane column will not stretch automatically by itself unless specified.



                        You can debug your program, by enabling the gridLinesVisible of GridPane property to true.



                        grid.setGridLinesVisible(true);


                        You need to specify the columnConstraints, to let the GridPane column stretch to the available width.



                        ColumnConstraints constraint = new ColumnConstraints();
                        constraint.setHgrow(Priority.ALWAYS);
                        grid.getColumnConstraints().add(constraint);





                        share|improve this answer






















                          up vote
                          0
                          down vote










                          up vote
                          0
                          down vote









                          As far as what I noticed, you added all the nodes in a column and set there positions, but you did not specify how much the column needs to be stretched. GridPane column will not stretch automatically by itself unless specified.



                          You can debug your program, by enabling the gridLinesVisible of GridPane property to true.



                          grid.setGridLinesVisible(true);


                          You need to specify the columnConstraints, to let the GridPane column stretch to the available width.



                          ColumnConstraints constraint = new ColumnConstraints();
                          constraint.setHgrow(Priority.ALWAYS);
                          grid.getColumnConstraints().add(constraint);





                          share|improve this answer












                          As far as what I noticed, you added all the nodes in a column and set there positions, but you did not specify how much the column needs to be stretched. GridPane column will not stretch automatically by itself unless specified.



                          You can debug your program, by enabling the gridLinesVisible of GridPane property to true.



                          grid.setGridLinesVisible(true);


                          You need to specify the columnConstraints, to let the GridPane column stretch to the available width.



                          ColumnConstraints constraint = new ColumnConstraints();
                          constraint.setHgrow(Priority.ALWAYS);
                          grid.getColumnConstraints().add(constraint);






                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Nov 11 at 22:58









                          Sai Dandem

                          86128




                          86128



























                              draft saved

                              draft discarded
















































                              Thanks for contributing an answer to Stack Overflow!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid


                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.

                              To learn more, see our tips on writing great answers.





                              Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                              Please pay close attention to the following guidance:


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid


                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.

                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function ()
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53253552%2fjavafx-gridpane-object-alignment%23new-answer', 'question_page');

                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              這個網誌中的熱門文章

                              Barbados

                              How to read a connectionString WITH PROVIDER in .NET Core?

                              Node.js Script on GitHub Pages or Amazon S3