我想在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}}
非常感谢帮助!
答案 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);
}
}