如何在JavaFX中加载大量元素?

How to load a large amount of elements in JavaFX?

我想在 fxml 中创建一个 connect four 游戏。我已经为开发板创建了 fxml,现在我想将所有 "coin fields" 带有图像视图的按钮加载到我的控制器中。
根据以前使用 fxml 的经验,我学会了像这样加载 fxml 元素:

@FXML
Button idOfButton;

如果我有想要更改的特定元素,这很好。但是因为我有 42 个按钮 (6*7),所以我不想为每个按钮字段都这样做……有什么办法可以用不同的方式来完成并自动生成它吗?我准备了这个 for 循环,但因为我不知道要在花括号中写入什么,所以它仍然毫无意义:D

Button[] coinButtons = new Button[42];

@FXML
public Button[] loadCoinButtons() {
    for(int x=0; x<7; x++) {
        for(int y=0; y<6; y++) {
        // Stuff that loads the buttons into my buttons array
        }
    }
    return coinButtons;
}

非常感谢您的帮助!

您可以在 Java 代码中创建这些按钮。不在 FXML 中声明它们并不意味着它们不属于您的场景。您需要做的是将 fx:id 标记提供给您想要放置更多按钮的容器,在 Controller class 中使用 @FXML 注释声明它,然后然后放一些新的 Nodes 在那里。看看下面的简单应用程序(假设所有文件都在 sample 包中)——我在 FXML 文件中创建了一些按钮,一些通过 Java 代码创建。

Main.java:

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

sample.fxml:

<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Button?>

<VBox fx:id="vBox" fx:controller="sample.Controller" xmlns:fx="http://javafx.com/fxml">
        <Button text="FXML_Button_1"/>
        <Button text="FXML_Button_2"/>
        <Button text="FXML_Button_3"/>
</VBox>

Controller.java:

package sample;

import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;

public class Controller {
  @FXML
  VBox vBox;

  private final int BUTTONS_NUMBER_OF_ROWS = 5;
  private final int BUTTONS_NUMBER_OF_COLUMNS = 5;
  private Button [][] buttons = new Button[BUTTONS_NUMBER_OF_ROWS][BUTTONS_NUMBER_OF_COLUMNS];


  @FXML
  private void initialize() {
    initializeButtonsArray();
    putButtonsOnGrid();
  }

  private void initializeButtonsArray() {
    for (int i = 0 ; i < BUTTONS_NUMBER_OF_COLUMNS ; i++) {
      for (int j = 0 ; j < BUTTONS_NUMBER_OF_ROWS ; j++) {
        buttons[i][j] = new Button("Button_" + i + j);
      }
    }
  }

  private void putButtonsOnGrid() {
    GridPane buttonsGridPane = new GridPane();
    for (int i = 0 ; i < BUTTONS_NUMBER_OF_COLUMNS ; i++) {
      for (int j = 0 ; j < BUTTONS_NUMBER_OF_ROWS ; j++) {
        buttonsGridPane.add(buttons[i][j], i, j);
      }
    }
    vBox.getChildren().add(buttonsGridPane);
  }
}