FXML中save方法仅更新最后一个Node的问题排查求助
问题原因与解决方法:仅能更新最后一个Node的问题
核心问题
你在save方法中反复调用loader.getController(),但类级别的loader变量会在addNode的循环中被不断覆盖,最终仅保留最后一个Node对应的FXMLLoader实例。因此无论循环多少次,你拿到的始终是最后一个Node的控制器,自然只能更新最后一个节点。
解决步骤
- 存储每个Node对应的控制器实例:不要只保存Node数组,改为存储每个节点对应的
Details控制器,这样能直接访问每个独立节点的控制器。 - 将FXMLLoader改为循环内局部变量:避免类级变量被覆盖的问题。
修改后的代码示例
类变量调整
@FXML private VBox putItems; @FXML private Button saveAction; // 替换原Node数组,改为存储控制器实例 Details[] controllers = new Details[Users.getDetails.size()];
addNode方法修改
private void addNode() { try { int i = 0; int x = 1; for (Object students : Users.getDetails()) { // 把loader改为循环内的局部变量,避免覆盖 FXMLLoader loader = new FXMLLoader(); Node node = loader.load( Objects.requireNonNull(getClass().getResource("marks.fxml")) .openStream()); putItems.getChildren().add(node); Details assessment = loader.getController(); // 将控制器存入数组,后续可直接调用 controllers[i] = assessment; assessment.set_Name((String) students); assessment.set_Number(String.valueOf(x)); assessment.set_Practice(); assessment.set_Class_50(); assessment.set_Total_all(); i++; x++; } } catch (IOException e) { e.printStackTrace(); } }
save方法修改
@FXML void save(ActionEvent event) throws SQLException { for (int i = 0; i < controllers.length; i++){ Details assessment = controllers[i]; assessment.set_Class_50(); assessment.set_Practice_50(); assessment.set_Total_all(); // 这里可添加数据库保存逻辑,比如调用assessment的持久化方法 } }
说明
- 原代码中类级别的
loader变量在循环中被多次赋值,最终仅保留最后一次创建的FXMLLoader,导致save方法只能获取最后一个控制器。 - 通过存储每个控制器实例,循环时可以逐个访问每个Node对应的控制器,实现对所有独立Node的更新操作。
内容的提问来源于stack exchange,提问作者i Devote
相关产品推荐
相关产品推荐

