如何在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);
}
}
我想在 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);
}
}