java - 在 FXML 文件中多次插入相同的对象 (JavaFX)

标签 java javafx fxml

我有一个包含 2 个选项卡的 FXML 文件。在每个选项卡中,我都有相同的 Text 元素列表。如何避免重复每个 Text 元素?

这是我的 FXML 文件的摘录:

<Tab>
    <GridPane>
        <columnConstraints>
            <ColumnConstraints />
        </columnConstraints>
        <rowConstraints>
            <RowConstraints />
            <RowConstraints />
            <RowConstraints />
            <RowConstraints />
        <RowConstraints />
        </rowConstraints>
        <children>
            <Text fx:id="text1" GridPane.rowIndex="1" />
            <Text fx:id="text2" GridPane.rowIndex="2" />
            <Text fx:id="text3" GridPane.rowIndex="3" />
            <Text fx:id="text4" GridPane.rowIndex="4" />
        </children>
    </GridPane>
</Tab>
<Tab>
    <GridPane>
        <columnConstraints>
            <ColumnConstraints />
        </columnConstraints>
        <rowConstraints>
            <RowConstraints />
            <RowConstraints />
            <RowConstraints />
            <RowConstraints />
        <RowConstraints />
        </rowConstraints>
        <children>
            <Text fx:id="text1" GridPane.rowIndex="1" />
            <Text fx:id="text2" GridPane.rowIndex="2" />
            <Text fx:id="text3" GridPane.rowIndex="3" />
            <Text fx:id="text4" GridPane.rowIndex="4" />
        </children>
    </GridPane>
</Tab>

如果我将相同的 id 放在两个 Text 元素中(例如:两个选项卡中的 fx:id="text1"),我会出错 (重复的 id 引用)。

最佳答案

可以使用 fx:include 重写 fxml和嵌套 Controller 。


创建一个新的 fxml 文件 sub.fxml 包含您重复的场景部分,例如

<Tab xmlns:fx="http://javafx.com/fxml/1" fx:controller="mypackage.SubController">
    <GridPane>
        <columnConstraints>
            <ColumnConstraints />
        </columnConstraints>
        <rowConstraints>
            <RowConstraints />
            <RowConstraints />
            <RowConstraints />
            <RowConstraints />
        <RowConstraints />
        </rowConstraints>
        <children>
            <Text fx:id="text1" GridPane.rowIndex="1" />
            <Text fx:id="text2" GridPane.rowIndex="2" />
            <Text fx:id="text3" GridPane.rowIndex="3" />
            <Text fx:id="text4" GridPane.rowIndex="4" />
        </children>
    </GridPane>
</Tab>

创建 SubController 类并使相关部分可访问:

public class SubController {
    @FXML
    private Text text1;
    ...
    @FXML
    private Text text4;

    public void setText1(String text) {
        this.text1.setText(text);
    }

    ...
}

现在更改“主要”fxml 以使用包含的 fxml:

<fx:include source="sub.fxml" fx:id="tab1" />
<fx:include source="sub.fxml" fx:id="tab2" />

并在父 Controller 中创建用于注入(inject) SubController 的字段:

@FXML
private SubController tab1Controller;
@FXML
private SubController tab2Controller;

您将能够像访问其他注入(inject)元素一样访问 Controller 。例如。在第一个 Tab 中设置 text1 的文本:

tab1Controller.setText1("Hello World!");

关于java - 在 FXML 文件中多次插入相同的对象 (JavaFX),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38248442/

相关文章:

java - android中固定日期和时间的警报管理器

java - 当某些事务的顺序很重要时,我如何多线程处理队列消费者?

JavaFX 3D绕纬度旋转相机Y

java - Selenium 网络驱动程序 : finding checkbox based on multiple row values

java - 是否可以使用 ArrayList 中的对象在 JavaFx 和 Scene Builder 中设置标签和单选按钮?

java - 带标题 Pane 的自动高度

java - 实现 JavaFX 形状的拖放

java - 如何将 SceneAntialiasing 设置为在 FXML 文件中创建的子场景?

java - IntelliJ 不保存更改

javafx - 如何锁定子阶段直到新的子阶段关闭