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

时间:2017-08-23 21:25:19

标签: java javafx fxml fxmlloader

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

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

如果我想要更改特定元素,这很好。但是因为我有42个按钮(6 * 7)我不想为每个按钮字段做这个...有什么方法可以用不同的方式做到并自动生成它?我准备这个for循环,但由于我不知道写入花括号的内容,它仍然没有意义:D

{{1}}

非常感谢帮助!

1 个答案:

答案 0 :(得分:1)

您可以在Java代码中创建这些按钮。不在FXML中声明它们并不意味着它们不属于您的场景。您要做的是将fx:id标记提供给您想要放置更多按钮的容器,在Controller类中使用@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);
  }
}

How does it look like - picture