繁体   English   中英

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

[英]Dynamically add widgets on a scene through fxml or Scene builder in JavaFX

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

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

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

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

提前致谢!

FXML格式不提供在循环中声明元素的方法。 因为Scene Builder只是用于FXML文件的WYSIWYG编辑器,所以它也没有提供此功能,也没有提供声明和配置256个元素的快捷方式(例如,通过对话框等)。 这是在代码中添加节点是正确的解决方案的情况之一。

为此,您需要将FXML文件链接到控制器。 从那里,您可以在initialize方法内创建所有256个CheckBox 此方法来自Initializable接口,尽管自JavaFX 8起,您不再需要实际实现该接口。 相反,你只需要声明一个名为无参数的方法initialize (见 ),并对其进行批注@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;
            }
        }
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM