通过参数将集合传递/绑定到FXML中的自定义组件(从vbox扩展)

问题描述 投票:0回答:1

在我的应用程序中,我已经声明了这样的自定义组件:

@DefaultProperty("todoItems")
public class TodoItemsVBox extends VBox {
    private ObservableList<TodoItem> todoItems;

    // Setter/Getter omitted
}

现在在fxml的某个地方,我想像这样使用TodoItemsVBox组件:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>

<BorderPane prefHeight="600" prefWidth="500.0" xmlns="http://javafx.com/javafx/11.0.1" 
xmlns:fx="http://javafx.com/fxml/1" 
fx:controller="com.todolist.controller.TodoListController"
        stylesheets="@../css/app.css">
<top>
    <HBox spacing="10.0">
        <TextField fx:id="input" layoutX="35.0" layoutY="64.0" prefWidth="431.0" promptText="Enter todo task" HBox.hgrow="ALWAYS" onAction="#addTask"/>
        <Button layoutX="216.0" layoutY="107.0" mnemonicParsing="false" onAction="#addTask" prefHeight="27.0" prefWidth="70.0" text="Add" HBox.hgrow="ALWAYS" />
        <padding>
            <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
        </padding>
    </HBox>
</top>
<center>
    <ScrollPane fitToHeight="true" fitToWidth="true" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
        <TodoItemsVBox fx:id="todoItemsVBox" todoItems="${todoTasks}"/>
    </ScrollPane>
</center>

...因此,我们可以看到fxml具有它的控制器TodoListController

public class TodoListController implements {
    private final ObservableList<TodoItem> todoTasks = FXCollections.observableArrayList(/*Fill in the collection somehow - for now doesn't matter*/);

    @FXML
    private TodoItemsVBox todoItemsVBox;

    // Setter/Getter omitted
}

所以,这就是我想做的:通过这样的构造将todoTasks传递到FXML中定义的TodoItemsVBox中:todoItems =“ $ {todoTasks}”]] ----不幸的是,这没有不能按我预期的那样工作,因为fxml文件在控制器初始化之前加载,因此todoTasks始终为null。我还在TodoItemsVBox中使用一个arg构造函数尝试了@NamedArg-甚至失败,并出现以下异常:“无法绑定到未类型化的对象。”

有人可以提出一种解决方案,如何通过其参数将控制器中定义的对象集合传递到自定义组件中?

在我的应用程序中,我声明了这样的自定义组件:@DefaultProperty(“ todoItems”)公共类TodoItemsVBox扩展了VBox {private ObservableList todoItems; // ...

java javafx fxml
1个回答
0
投票

您所拥有的代码有两个问题:

© www.soinside.com 2019 - 2024. All rights reserved.