如何使用表达式引用控制器中的模型数据来填充tableview中的项目?我想在FXML文件中做到这一点。
答案 0 :(得分:3)
在加载FXML之前,您可以通过将模型放入FXMLLoader
命名空间来完成此工作。它涉及控制器,型号和FXMLLoader之间的大量接线。
鉴于
public class Model {
public ObservableList<SomeDataType> getTableItems() {
// ...
}
}
和带有
的FXML文件View.fxml<!-- root element: -->
<BorderPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.Controller">
<TableView fx:id="table" items="${model.tableItems}">
<!-- ... -->
</TableView>
<!-- ... -->
</BorderPane>
然后您可以执行以下操作:
Model model = new Model();
// configure model as needed...
FXMLLoader loader = new FXMLLoader(getClass().getResource("View.fxml"));
loader.getNamespace().put("model", model);
Parent root = loader.load();
// etc
请注意,不会允许将模型的常规FXML注入到控制器中,正如您所料(我认为这是一种疏忽......)。所以简单地做
public class Controller {
@FXML
private Model model ;
// ...
}
无法让您访问控制器中的模型。如果您需要这样做,那么您需要手动设置它:
Model model = new Model();
FXMLLoader loader = new FXMLLoader(getClass().getResource("View.fxml"));
loader.getNamespace().put("model", model);
Parent root = loader.load();
Controller controller = loader.getController();
controller.setModel(model);
在setModel(...)
中定义明显的Controller
方法。
如果您需要使用控制器的initialize()
方法访问模型,那么您需要更进一步:
Model model = new Model();
Controller controller = new Controller();
controller.setModel(model); // or define a constructor taking the model...
FXMLLoader loader = new FXMLLoader(getClass().getResource("View.fxml"));
loader.getNamespace().put("model", model);
loader.setController(controller);
Parent root = loader.load();
在此版本中,您必须从FXML文件中删除<fx:controller>
属性(因为已经设置了控制器)。
考虑到使其工作所需的所有复杂布线,最好只在控制器的初始化方法中设置表格项目。