我正在研究一个简单的BeatBox,其中会根据所选的复选框播放不同的声音。
该程序应该具有256个复选框,以16x16网格显示。因此,当我通过直接代码(即没有fxml或场景生成器)构建GUI时,我可以轻松创建一个简单的循环来创建256个复选框,将它们添加到列表中,以便以后使用,然后将它们添加到网格。
我正在尝试更改这种方法,并使用场景生成器或直接在fxml文件中进行编码,但是我找不到解决方法,我什至不知道这样做是否可行。为了弄清楚这一点,我遇到了这个疑问: -有没有一种方法可以通过fxml或场景构建器创建某种类型的小部件的列表,并填充大量组件(对于我的给定示例,列表中包含256个CheckBox),然后在我的Controller上引用该列表上课?
我真的不喜欢在场景构建器上拖放256个复选框的想法,甚至不喜欢在fxml上创建256个标签的想法。我认为该功能可能对许多其他情况有用。因此,如果可能的话,我很乐意提供帮助。
谢谢!
答案 0 :(得分:1)
FXML格式不提供在循环中声明元素的方法。由于 Scene Builder 只是用于FXML文件的WYSIWYG编辑器,因此它也没有提供此功能,也没有提供声明和配置256个元素的快捷方式(例如,通过对话框等) )。这是在代码中添加节点是正确的解决方案的情况之一。
为此,您需要将FXML文件链接到控制器。在这里,您可以在CheckBox
方法内创建所有256个initialize
。此方法来自Initializable
接口,尽管自JavaFX 8起,您不再需要实际实现该接口。相反,您只需声明一个名为initialize
的无参数方法(请参见this),如果非@FXML
则用public
进行注释。
这是一个小例子:
FXML文件
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<!-- replace with your root -->
<HBox xmlns="http://javafx.com/javafx/11.0.2" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="com.example.Controller">
<GridPane fx:id="grid"/>
<!-- other elements... -->
</HBox>
控制器
package com.example;
import javafx.fxml.FXML;
import javafx.scene.control.CheckBox;
import javafx.scene.layout.GridPane;
public class Controller {
@FXML private GridPane grid;
private CheckBox[][] boxes; // for access by grid coordinates
@FXML
private void initialize() {
boxes = new CheckBox[16][16];
for (int row = 0; row < boxes.length; row++) {
for (int col = 0; col < boxes[0].length; col++) {
CheckBox box = new CheckBox();
grid.add(box, col, row);
boxes[row][col] = box;
}
}
}
}