【问题标题】:Update each node with distinct value用不同的值更新每个节点
【发布时间】: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


【解决方案1】:

获取现有代码以更新所有节点的快速解决方案可能是存储加载的控制器并更新它们:

public class Assessment implements Initializable {

...

private List <Details> subControllers = new ArrayList<>();

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
    addNode();
}

private void addNode() {

    try {

        for (Object students : Users.getDetails() ) {
            loader = new FXMLLoader();
           ...
           Details assessment = loader.getController();
           subControllers.add(assessment); // store controllers
           ...
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

}

@FXML
void save(ActionEvent event) throws SQLException {
    for (Details assessment : subControllers){
        assessment.set_Class_50();
        assessment.set_Practice_50();
        assessment.set_Total_all();
    }
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2019-10-25
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多