Выравнивание объектов JavaFX GridPane - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь использовать JavaFX для создания сцены с названием программы, расположенным вверху по центру, и кнопками в вертикальной линии вдоль левой стороны сцены. Однако оба этих элемента отображаются в сгруппированном виде в правом верхнем углу сцены, а не там, где я хочу, чтобы они были.

Как я могу заставить эти элементы отображаться там, где я хочу?

Вот как я пытаюсь установить позицию заголовка программы:

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

Я пытаюсь установить объект VBox аналогично:

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

Это то, что отображается: This is what is displayed

Весь мой класс MainMenu. (Этот класс вызывается в моем главном классе для создания сцены):

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;
   }


}

Мой основной класс (отображает сцену):

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);
   }


}

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Ячейка по умолчанию, в которую вы добавляете дочерние элементы GridPane, равна (0, 0), что вы и делаете в этой строке:

grid.getChildren().add(buttonBox);

вам нужно изменить это на

grid.add(buttonBox, 0, 1);

, чтобы установить индекс строки на 1. (Существуют альтернативы для назначения индекса строки таким способом, но это наиболее удобный вариант в этом случае.)

Это не приведет к тому, что первый столбец займет всю ширину GridPane. Если вы также хотите, чтобы первый столбец занимал всю доступную ширину, необходимо указать это, добавив ColumnConstraints:

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

grid.getColumnConstraints().add(constraints);
0 голосов
/ 12 ноября 2018

Насколько я заметил, вы добавили все узлы в столбце и установили там позиции, но вы не указали, сколько столбца нужно растянуть. Столбец GridPane не будет автоматически растягиваться, если не указано иное.

Вы можете отлаживать вашу программу, включив свойство gridLinesVisible свойства GridPane в true.

grid.setGridLinesVisible(true);

Необходимо указать columnConstraints, чтобы столбец GridPane растянулся до доступной ширины.

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