当前位置: 首页 > 知识库问答 >
问题:

在java fxml中向fx:root元素的child添加children

西门嘉石
2023-03-14

这就是我目前所拥有的。

名为PopupContainer的根元素

<fx:root type="StackPane" alignment="CENTER" xmlns:fx="http://javafx.com/fxml"
     styleClass="popup">
    <VBox alignment="CENTER">
        <HBox alignment="CENTER">
            <VBox fx:id="content" alignment="CENTER" spacing="5" styleClass="whiteBackground, blackborder"
              fillWidth="false" StackPane.alignment="CENTER">
            <!-- this is where I would like to add components -->
            </VBox>
        </HBox>
    </VBox>
</fx:root>

我也有控制器。

<PopupContainer xmlns="http://javafx.com/javafx"
            xmlns:fx="http://javafx.com/fxml"
            fx:controller="com.example.bank.editbank.EditBankPresenter"
            styleClass="popup"
            fx:id="container">
    <!-- those components should go to VBOX up there -->
    <ViewTitle label="%editBankUC"/>
    <Button fx:id="someButton" text="Click me"/>
</PopupContainer>

当然,当我添加组件时,它们直接在StackPane下面,因为它是布局的根。我试图重写getChildren()方法以返回VBox子级,但我检测到了子级循环。我不想以编程方式添加它们,因为在应用程序中有超过300个这样的情况,但是我可以添加新的标记(而不是例如其他的东西)。谢谢!

共有1个答案

冯开诚
2023-03-14

回答我自己的问题,因为我想其他人也想知道这一点。

因此,正如我前面所说的,这是PopupContainer.fxml:

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.layout.HBox?>
<?import javafx.geometry.Insets?>
<fx:root type="StackPane" alignment="CENTER" xmlns:fx="http://javafx.com/fxml"
         styleClass="popup">
    <VBox fx:id="child1" alignment="CENTER">
        <HBox alignment="CENTER">
            <VBox fx:id="content" alignment="CENTER" spacing="5" styleClass="whiteBackground, blackborder"
                  fillWidth="false" StackPane.alignment="CENTER">

                <padding>
                    <Insets topRightBottomLeft="10.0" />
                </padding>
            </VBox>
        </HBox>
    </VBox>
</fx:root>

和控制器PopupContainer.java:

import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;

import java.io.IOException;

public class PopupContainer extends StackPane {

    //refference to VBox from layout
    @FXML private VBox content;

    public PopupContainer() {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("PopupContainer.fxml"));
        fxmlLoader.setRoot(this);
        fxmlLoader.setController(this);

        try {
            fxmlLoader.load();
        } catch (IOException exception) {
            throw new RuntimeException(exception);
        }
    }

    //note this getter, this is the key that allow you to add childred to child of this component
    public ObservableList<Node> getItems() {
        return content.getChildren();
    }
}
<PopupContainer xmlns="http://javafx.com/javafx"
                xmlns:fx="http://javafx.com/fxml"
                fx:controller="com.example.bank.editbank.EditBankPresenter"
                styleClass="popup"
                fx:id="container"
>
    <!-- this is what was acceptable to do in question so instead of children I am using items (setter in PopupContainer.java) -->
    <items>
        <ViewTitle label="%editBankUC"/>
        <HBox VBox.vgrow="ALWAYS">
            <Pane minWidth="20"/>
            <VBox alignment="CENTER" spacing="5">
                <HorizontalTextInput fx:id="name" label="%nameUC" alignment="CENTER_RIGHT" />
                <HorizontalTextInput fx:id="bic" label="%bicUC" alignment="CENTER_RIGHT" />
                <AddressInput fx:id="address" />
                <HorizontalCheckboxInput fx:id="active" label="%activeUC" />
            </VBox>
            <Pane minWidth="20"/>
        </HBox>
        <HBox alignment="CENTER" spacing="5">
            <JFXButton fx:id="close" onAction="#closeView" text="%closeUC" />
            <JFXButton fx:id="edit" onAction="#editClicked" />
            <padding>
                <Insets top="10.0" bottom="10.0" />
            </padding>
        </HBox>
    </items>
</PopupContainer>
 类似资料:
  • 问题内容: 假设我有一个数组,例如: 然后我想将一个元素推/追加到所述数组的末尾,以获得: 我应该使用哪种方法? 那我想在数组的 前面 添加一个元素呢?是否有固定的时间班次? 问题答案: 从 Swift 3/4/5开始 ,操作如下。 向数组末尾添加新元素。 将另一个数组附加到数组的末尾。 向您的数组中插入一个新元素。 将另一个数组的内容插入到数组中。 更多信息可以从第110页开始的“ Swift编

  • 我需要填充一个json文件,现在我有如下内容: 我需要添加另一个“元素”。我的第一步是使用,现在我需要添加新元素。我想我必须使用添加另一个元素,我尝试了以下方法: 但是当我尝试做时,我得到了错误"对象没有方法推送",我认为我做了一些非常错误的事情,因为我没有告诉任何地方的"元素"。 我该怎么做? 编辑:对不起,我脑子里有很多困惑。 我认为从,但我首先得到了我在JSON中输入的内容。 用数组代替对象

  • 我有个文件名测试。json 我读了这个文件,我想得到这个 我要阅读和构建的代码 从JSON的那句话中,我得到了 com.google.gson.stream.MalformedJsonException:使用JsonReader.setLenient(true)接受格式错误的JSON 我的绳子坏了? 我试过了 我知道这不是JSON数组。

  • 问题内容: 我是Groovy的新手,尽管阅读了许多有关此的文章和问题,但我仍然不清楚发生了什么。到目前为止,据我了解,当您在Groovy中创建新数组时,底层类型是Java ArrayList。这意味着它应该可调整大小,您应该能够将其初始化为空,然后通过add方法动态添加元素,如下所示: 编译,但是在运行时失败:方法的无签名:[LMyType; .add()适用于参数类型:(MyType)值:[My

  • 问题内容: 我有办法 在内部,我想调用另一个方法并将其传递,但是我想向其他对象添加新元素(描述)。 如何在Java中做到这一点?代码是什么样的? 问题答案: 只是一个数组。因此: 您可能需要弄混的通用类型。 您可以更快但更冗长:

  • 我对JavaFX相对较新,我很困惑为什么我下面的代码没有产生预期的结果,即添加到网格中的标签。 我想做的是运行一个测试,将JavaFX标签添加到我的FXML GridPane,因为我想在不久的将来构建一个方法,允许用户选择一个文件,然后在用户选择文件时生成一个标签并将该标签添加到GridPane。 提前感谢, 代码: FXML代码是一个标准文件,其中定义了一个网格窗格,上面列出了fx:id。