在我的应用程序中,我已经声明了这样的自定义组件:
@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
您所拥有的代码有两个问题: