在 Java 和 JavaFX 中跨场景传输信息时信息未更新

Information not being updated when transferring information across scenes in Java and JavaFX

我有一个登录页面,我正在尝试让他们输入的用户电子邮件显示在下一页(即他们的主页)上。这是代码:

            FXMLLoader loaderNew = new FXMLLoader(getClass().getResource("/sample/view/Dashboard.fxml"));
            try {
                loaderNew.load();
            } catch (IOException e) {
                e.printStackTrace();
            }
            DashboardController dashboardController = loaderNew.getController();
            dashboardController.setName(loginEmail.getText().trim());

这是我要调用的方法:

public void setName(String name){
    nameLbl.setText(name);
}

我没有收到任何错误,只是没有更新 nameLbl,我不知道为什么。 logincontroller 将成功进入仪表板,只是不会更新 nameLbl。

这里有两个完整的代码。

登录控制器:

package sample.controller;

import java.io.IOException;
import java.net.URL;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import sample.database.DBConnection;
import sample.model.User;

public class LoginController {

    @FXML
    private ResourceBundle resources;

    @FXML
    private URL location;

    @FXML
    private Button loginButton;

    @FXML
    private TextField loginEmail;

    @FXML
    private Button createAccountSwitchButton;

    @FXML
    private Label errorLabel;

    @FXML
    private PasswordField loginPassword;

    private DBConnection dbConnection;

    @FXML
    void initialize() {

        dbConnection = new DBConnection();


        loginButton.setOnAction(event-> {


            String loginEmailText = loginEmail.getText().trim();
            String loginPasswordText = loginPassword.getText().trim();

            User user = new User();
            user.setEmail(loginEmailText);
            user.setPassword(loginPasswordText);

            ResultSet userRow = dbConnection.checkForUser(user);
            int counter = 0;

            try{
                while (userRow.next()){
                    counter++;
                }
                if (counter==1){
    //-------------------Below this line to the next line seems to do nothing-------------------------------------------------------------------

                    FXMLLoader loaderNew = new FXMLLoader(getClass().getResource("/sample/view/Dashboard.fxml"));
                    try {
                        loaderNew.load();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    DashboardController dashboardController = loaderNew.getController();
                    dashboardController.setName(loginEmail.getText().trim());
//---------------------------------------------------------------------------------------

                    loginButton.getScene().getWindow().hide();
                    FXMLLoader loader = new FXMLLoader();
                    loader.setLocation(getClass().getResource("/sample/view/Dashboard.fxml"));

                    try {
                        loader.load();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    Parent root = loader.getRoot();
                    Stage stage = new Stage();
                    stage.setScene(new Scene(root));
                    stage.showAndWait();

                }else{
                    errorLabel.setText("Email or Password Incorrect");
                }
            }catch(SQLException e){
                e.printStackTrace();
            }
        });

    }

}

仪表板控制器:

package sample.controller;

//imports here same as above

public class DashboardController {

    @FXML
    private Label nameLbl;


    public void setName(String name){
        nameLbl.setText(name);
    }


    @FXML
    void initialize() {

    }
}

似乎我在 Dashboard 控制器中的方法从未被调用,这是为什么?在此先感谢您的帮助。

我更新了这个小片段,它只加载了一个 FXML 加载器,现在可以正常工作了。

                loginButton.getScene().getWindow().hide();
                FXMLLoader loader = new FXMLLoader(getClass().getResource("/sample/view/Dashboard.fxml"));

                try {
                    loader.load();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                Parent root = loader.getRoot();
                DashboardController dashboardController = loader.getController();
                dashboardController.setName(loginEmail.getText().trim());
                Stage stage = new Stage();
                stage.setScene(new Scene(root));
                stage.show();