【发布时间】:2015-03-23 11:26:51
【问题描述】:
如何使用从控制器引用模型数据的表达式来填充表格视图中的项目?我想在 FXML 文件中进行。
【问题讨论】:
如何使用从控制器引用模型数据的表达式来填充表格视图中的项目?我想在 FXML 文件中进行。
【问题讨论】:
您可以通过在加载 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);
使用Controller 中定义的明显的setModel(...) 方法。
如果你需要在控制器的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> 属性(因为控制器已经设置)。
考虑到让它工作所需的所有复杂接线,最好只在控制器的初始化方法中设置表的项目。
【讨论】: