如何使用来自 Controller 的引用模型数据的表达式填充 TableView 中的项目?我想在 FXML 文件中完成。
最佳答案
您只需将模型放入 FXMLLoader
即可完成这项工作加载 FXML 之前的命名空间。它涉及 Controller 、模型和 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 注入(inject)到 Controller 中(我认为这是一个疏忽...)。所以简单地做
public class Controller {
@FXML
private Model model ;
// ...
}
不会让您访问 Controller 中的模型。如果你需要这个,你可能会这样做,那么你需要手动设置它:
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
中定义的方法.
如果您需要访问 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();
在此版本中,您必须删除 <fx:controller>
来自 FXML 文件的属性(因为已经设置了 Controller )。
考虑到要使其正常工作所需的所有复杂布线,最好只在 Controller 的初始化方法中设置表的项目。
关于java - 使用 FXML 中的数据绑定(bind)表达式填充 tableView 中的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29209072/