簡體   English   中英

JavaFX GridPane對象對齊

[英]JavaFX GridPane Object Alignment

我正在嘗試使用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);

這是顯示的內容: 這是顯示的

我的整個MainMenu類。 (在我的Main類中調用該類來構造場景):

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


}

您將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);

據我所知,您在列中添加了所有節點並在其中設置了位置,但未指定列需要擴展多少。 除非指定,否則GridPane列將不會自動自動拉伸。

您可以通過將GridPane的gridLinesVisible屬性設置為true來調試程序。

grid.setGridLinesVisible(true);

您需要指定columnConstraints,以使GridPane列拉伸到可用寬度。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM