【发布时间】:2022-08-20 00:57:30
【问题描述】:
我想根据用户输入更新单个节点,但方法save(在单击按钮saveAction 时起作用)往往只更新nodes 中的最后一个节点。由于我无法在生成的单个节点上完成这项工作,我缺少什么?
public class Assessment implements Initializable {
@FXML
private VBox putItems;
@FXML
private Button saveAction;
Node[] nodes = new Node[Users.getDetails.size()];
FXMLLoader loader = null;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
addNode();
}
private void addNode() {
try {
int i = 0;
int x = 1;
for (Object students : Users.getDetails() ) {
loader = new FXMLLoader();
nodes[i] = loader.load(
Objects.requireNonNull(getClass().getResource(\"marks.fxml\"))
.openStream());
putItems.getChildren().add(nodes[i]);
Details assessment = loader.getController();
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();
}
}
@FXML
void save(ActionEvent event) throws SQLException {
for (int i = 0; i < nodes.length; i++){
Details assessment = loader.getController();
assessment.set_Class_50();
assessment.set_Practice_50();
assessment.set_Total_all();
}
}
}
谢谢你!
-
我建议您提供minimal reproducible example,将数据库调用存根以仅返回虚拟测试数据,并提供 fxml,这样您的问题就可以通过复制和粘贴来复制,而无需更改、添加或超出 JDK 和 JavaFX 的库。更新代码以遵循naming conventions 并使用您的 IDE 的格式选项对其进行格式化。
-
您在保存中循环节点数组长度,但在每次迭代中,您使用相同的加载器引用,这将是对您在 addNode 循环中创建的最后一个加载器的引用,因此在保存方法中,您只是调用相同的每次循环迭代在同一评估对象上的方法。
-
那么如何根据数组中的位置获取加载器引用呢?
-
\“那么我如何根据数组中的位置获取加载器引用?\” -> 你没有。 loader只是用来加载的,加载完成后就不需要了。加载加载器后,其中包含一些信息(控制器),一旦加载完成,您可以从加载器中获取这些信息,并将控制器放入数组或列表中,然后迭代该列表。
-
我提供的那个建议会起作用,但是会有点奇怪,只是为了让你快速继续。也许您应该查看MVC(另请参阅该帖子中的 Eden 链接),因为应用 MVC 可能是解决您要解决的问题的更好方法。如何将其具体应用于您的应用程序超出了我将在这里回答的范围。
标签: java javafx scenebuilder