首页 > 解决方案 > JavaFX 访问已经创建的控制器

问题描述

我有一个带有 3 个场景的 JavaFX,我们称它们为 A、B、C。从场景 A,我通过按一个按钮进入场景 B。从场景B,我以同样的方式去场景C。现在问题来了。在 C 场景中,我需要来自 A 场景中的文本字段的数据。我尝试在 C 控制器中创建一个类成员字段并从 A 场景设置它但它不起作用,因为要转到场景 C,我在场景 B 中调用 load() 方法(所以基本上它是 C 控制器的新实例)。

好的,所以我有带有相应控制器的 ResetPasswordPage.fxml:

public class ResetPasswordPageController {
private DatabaseAccess databaseAccess = new DatabaseAccess();
private String username;

@FXML
private TextField userFieldResetPasswordPage;

@FXML
void goToVerificationPage(ActionEvent event) {
    ResultSet resultSet = databaseAccess.executeSelectQuery("SELECT email FROM USER WHERE username = ?",
            new Object[] { userFieldResetPasswordPage.getText() });
    try {
        if (!resultSet.next()) {
            System.out.println("User doesn't exist");
            return;
        }

        String email = resultSet.getString("email");
        this.username = userFieldResetPasswordPage.getText();

        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("NewPasswordPage.fxml"));
        Parent parent = fxmlLoader.load();
        NewPasswordPageController newPasswordPageController = fxmlLoader.getController();
        newPasswordPageController.setUser(userFieldResetPasswordPage.getText()); // this is useless since I dont't
                                                                                    // go directly to
                                                                                    // NewPasswordPage, so I will
                                                                                    // have to call load method once
                                                                                    // again from the next screen

        int key = EmailSender.generateRandomKey();
        EmailSender.sendEmail(email, key);

        FXMLLoader fxmlLoader1 = new FXMLLoader(getClass().getResource("CodeVerificationPage.fxml"));
        Parent parent1 = fxmlLoader1.load();
        CodeVerificationPageController codeVerificationPageController = fxmlLoader1.getController();
        codeVerificationPageController.setGeneratedKey(key);
        Utilities.changeScene(event, parent1);

    } catch (SQLException | IOException | MessagingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

public String getUser() {
    return username;

}

这里的问题是我没有直接从ResetPasswordPage到NewPasswordPage但是有一个中间页面(CodeVerificationPage),所以如果我在ResetPasswordPage这里设置字段它不会有任何效果,因为NewPasswordPage场景是从CodeVerificationPage(中间页)..

标签: javajavafxcontrollerfxml

解决方案


推荐阅读