gpt4 book ai didi

java - 通过 JavaFX 中的 fxml 或场景构建器在场景上动态添加小部件

转载 作者:行者123 更新时间:2023-12-02 10:11:50 26 4
gpt4 key购买 nike

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

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

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

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

提前致谢!

最佳答案

FXML 格式不提供在循环中声明元素的方法。因为场景生成器只是一个 WYSIWYG FXML 文件编辑器也不提供此功能,也不提供声明和配置 256 个元素的快捷方式(例如通过对话框或其他方式)。这是在代码中添加节点是正确解决方案的情况之一。

为此,您需要将 FXML 文件链接到 Controller 。从那里您可以在 initialize 方法中创建所有 256 个 CheckBox。此方法来自Initializable接口(interface),但从 JavaFX 8 开始您不再需要实际实现该接口(interface)。相反,您只需声明一个名为 initialize 的无参数方法(请参阅 this ),并在非 public 时使用 @FXML 对其进行注释。

这是一个小例子:

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>

Controller

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

}

关于java - 通过 JavaFX 中的 fxml 或场景构建器在场景上动态添加小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54951970/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com