【问题标题】:JavaFX GridPane Object AlignmentJavaFX GridPane 对象对齐
【发布时间】:2019-04-14 15:58:43
【问题描述】:

我正在尝试使用 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);
   }


}

【问题讨论】:

    标签: java user-interface javafx graphics gridpane


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      据我所知,您在列中添加了所有节点并设置了位置,但您没有指定列需要拉伸多少。除非指定,否则 GridPane 列不会自动拉伸。

      您可以通过将 GridPane 属性的 gridLinesVisible 设置为 true 来调试您的程序。

      grid.setGridLinesVisible(true);
      

      您需要指定 columnConstraints,让 GridPane 列拉伸到可用宽度。

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

      【讨论】:

        猜你喜欢
        • 2016-07-31
        • 1970-01-01
        • 2017-04-18
        • 2014-11-09
        • 2016-05-28
        • 1970-01-01
        • 2019-01-08
        • 2020-12-05
        • 2016-05-14
        相关资源
        最近更新 更多