在JavaFX中登录后传递用户数据
我试图在登录后将用户的数据传递到他的主页(用他的名字等设置标签)。 我已经试过一些方法,但没有一种对我有效。 我打算:在JavaFX中登录后传递用户数据,java,authentication,javafx,controller,Java,Authentication,Javafx,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…抱歉。非常感谢。