在JavaFX中登录后传递用户数据

在JavaFX中登录后传递用户数据,java,authentication,javafx,controller,Java,Authentication,Javafx,Controller,我试图在登录后将用户的数据传递到他的主页(用他的名字等设置标签)。 我已经试过一些方法,但没有一种对我有效。 我打算: 使用数据库连接登录用户(没有问题) 从数据库检索他的数据(没有问题) 将其数据传递到主页控制器(登录后立即) 特别是我想为他的个人资料设置一个带有他的名字和图像的标签,所有这些数据都存储在数据库中,并在登录时检索。 我曾尝试使用场景生成器设置控制器,但以这种方式,我不知道如何将参数传递给他的构造函数。因此,我从fxml文件中删除了fx:controller属性,并将控制器设置为

我试图在登录后将用户的数据传递到他的主页(用他的名字等设置标签)。 我已经试过一些方法,但没有一种对我有效。 我打算:

  • 使用数据库连接登录用户(没有问题)
  • 从数据库检索他的数据(没有问题)
  • 将其数据传递到主页控制器(登录后立即)
  • 特别是我想为他的个人资料设置一个带有他的名字和图像的标签,所有这些数据都存储在数据库中,并在登录时检索。 我曾尝试使用场景生成器设置控制器,但以这种方式,我不知道如何将参数传递给他的构造函数。因此,我从fxml文件中删除了fx:controller属性,并将控制器设置为:

    //Inizilized the user at login
    User_Home_Controller userHomeController = new User_Home_Controller(loggedUser);
    FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/UserHomePage.fxml"));
    loader.setController(userHomeController);
    Parent root = loader.load();
    
    但是它在UserHomeController构造函数上给了我一个NullPointerException。 所有这些都发生在LoginController中。这就是问题所在吗? 我发布的代码是另一个解决方案。我正在使用user home controller的方法来设置标签的用户和数据。这个解决方案还在initData方法中为我提供了一个NullPointerException。 这是我的用户\家庭\控制器:

    package controllers;
    
    import java.net.URL;
    import java.util.ResourceBundle;
    
    import entity.VolunteerUser;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.Button;
    import javafx.scene.image.ImageView;
    import javafx.scene.text.Text;
    
    public class User_Home_Controller implements Initializable{
    
        VolunteerUser currentUser;
    
        public void initData(VolunteerUser user) {
            setCurrentUser(user);
            this.nomeCognome.setText(user.getNome() + " "+ user.getCognome());
        }
    
    
        @FXML
        private Text nomeCognome;
    
        @Override
        public void initialize(URL location, ResourceBundle resources) {
    
        }
    
    }
    
    
    package controllers;
    
    import java.io.IOException;
    import java.net.URL;
    import java.util.ResourceBundle;
    
    
    import entity.Login;
    import entity.VolunteerUser;
    import javafx.application.Platform;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.fxml.Initializable;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.TextField;
    import javafx.scene.text.Text;
    import javafx.stage.Stage;
    
    public class Login_Controller {
    
        @FXML
        private TextField usernameField;
    
        @FXML
        private TextField passwordField;
    
        @FXML
        private Button loginButton;
    
        @FXML
        private Button registerButton;
    
    
        @FXML
        void loginPressed(ActionEvent event) {
    
            //All of the login stuff is missing here, but it's okay
    
            int loginResult = login.logger(usernameField.getText(), passwordField.getText());
            if (loginResult>0) {
    
    
                if (login.getTableUser() == 1) {
    
    
                    VolunteerUser loggedUser = vrep.getVolunteerByID(login.returnID(usernameField.getText(), 1));
                    System.out.println(loggedUser.getCognome()); //This works
    
                    try {
                        FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/UserHomePage.fxml"));
                        Parent root = loader.load();
    
                        User_Home_Controller userHomeController = loader.<User_Home_Controller>getController();
                        userHomeController.initData(loggedUser);
    
                        Stage home = (Stage) loginButton.getScene().getWindow();
                        home.setScene(new Scene(root, 800, 600));
                        home.show();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
    
    
    }
    
    
    这是LoginController:

    package controllers;
    
    import java.net.URL;
    import java.util.ResourceBundle;
    
    import entity.VolunteerUser;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.Button;
    import javafx.scene.image.ImageView;
    import javafx.scene.text.Text;
    
    public class User_Home_Controller implements Initializable{
    
        VolunteerUser currentUser;
    
        public void initData(VolunteerUser user) {
            setCurrentUser(user);
            this.nomeCognome.setText(user.getNome() + " "+ user.getCognome());
        }
    
    
        @FXML
        private Text nomeCognome;
    
        @Override
        public void initialize(URL location, ResourceBundle resources) {
    
        }
    
    }
    
    
    package controllers;
    
    import java.io.IOException;
    import java.net.URL;
    import java.util.ResourceBundle;
    
    
    import entity.Login;
    import entity.VolunteerUser;
    import javafx.application.Platform;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.fxml.Initializable;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.TextField;
    import javafx.scene.text.Text;
    import javafx.stage.Stage;
    
    public class Login_Controller {
    
        @FXML
        private TextField usernameField;
    
        @FXML
        private TextField passwordField;
    
        @FXML
        private Button loginButton;
    
        @FXML
        private Button registerButton;
    
    
        @FXML
        void loginPressed(ActionEvent event) {
    
            //All of the login stuff is missing here, but it's okay
    
            int loginResult = login.logger(usernameField.getText(), passwordField.getText());
            if (loginResult>0) {
    
    
                if (login.getTableUser() == 1) {
    
    
                    VolunteerUser loggedUser = vrep.getVolunteerByID(login.returnID(usernameField.getText(), 1));
                    System.out.println(loggedUser.getCognome()); //This works
    
                    try {
                        FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/UserHomePage.fxml"));
                        Parent root = loader.load();
    
                        User_Home_Controller userHomeController = loader.<User_Home_Controller>getController();
                        userHomeController.initData(loggedUser);
    
                        Stage home = (Stage) loginButton.getScene().getWindow();
                        home.setScene(new Scene(root, 800, 600));
                        home.show();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
    
    
    }
    
    

    如果
    user
    为非null,则此代码使用此堆栈跟踪抛出NPE的唯一其他可能性是
    nomeCognome
    为null。为什么会这样?不知道,fxml可能不包含具有相应
    fx:id
    的元素,但您尚未发布有关fxml的信息。请发布最小的源代码或/view/UserHomePage.fxml,如果在fxml文件中未设置
    fx:controller
    值,则会发生此类错误。错误是没有将nomeCognome指定为场景生成器标签的fx:id…抱歉。非常感谢。