通过fxml或JavaFX中的Scene生成器在场景上动态添加窗口小部件

时间:2019-03-01 20:38:05

标签: java javafx fxml scenebuilder scene

我正在研究一个简单的BeatBox,其中会根据所选的复选框播放不同的声音。

该程序应该具有256个复选框,以16x16网格显示。因此,当我通过直接代码(即没有fxml或场景生成器)构建GUI时,我可以轻松创建一个简单的循环来创建256个复选框,将它们添加到列表中,以便以后使用,然后将它们添加到网格。

我正在尝试更改这种方法,并使用场景生成器或直接在fxml文件中进行编码,但是我找不到解决方法,我什至不知道这样做是否可行。为了弄清楚这一点,我遇到了这个疑问: -有没有一种方法可以通过fxml或场景构建器创建某种类型的小部件的列表,并填充大量组件(对于我的给定示例,列表中包含256个CheckBox),然后在我的Controller上引用该列表上课?

我真的不喜欢在场景构建器上拖放256个复选框的想法,甚至不喜欢在fxml上创建256个标签的想法。我认为该功能可能对许多其他情况有用。因此,如果可能的话,我很乐意提供帮助。

谢谢!

1 个答案:

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

}