Java Swing跨JFrame传递邮箱密码时出现NULL值问题求助
嘿,我一眼就瞅出问题所在啦!你在LoginForm里创建了一个DataTransfer实例存数据,但在InfoDisplay的构造方法里又重新new了一个全新的DataTransfer对象——这俩完全是独立的实例,后者自然拿不到前者存的数据咯!
下面给你几个实用的解决方案,你可以根据需求选:
方案一:直接把DataTransfer实例传给InfoDisplay
这是最贴合你现有代码结构的改法,核心就是让两个窗口用同一个DataTransfer对象:
- 修改
LoginForm.java里的代码,把存好数据的dt传给InfoDisplay:
String mail,pass; // 存储邮箱和密码数据 if(op==true) { JOptionPane.showMessageDialog(null, "Login Successful!", "WebApp Database Login", INFORMATION_MESSAGE); DataTransfer dt=new DataTransfer(); dt.setEmail(mail); dt.setPassword(pass); // 把dt作为参数传给InfoDisplay的构造方法 InfoDisplay id=new InfoDisplay(dt); id.setVisible(true); }
- 修改
InfoDisplay.java的构造方法,接收这个实例并读取数据:
private DataTransfer dt; //Constructor public InfoDisplay(DataTransfer transferData) { initComponents(); // 显示当前日期时间 Calendar cl=Calendar.getInstance(); String datetime=cl.getTime().toString(); jLabel5.setText(datetime); // 使用传进来的同一个DataTransfer实例 this.dt = transferData; String finalEmail=dt.getEmail(); String finalPass=dt.getPassword(); System.out.println("Email: "+finalEmail); System.out.println("Password: "+finalPass); }
方案二:直接传邮箱和密码(更简单直接)
如果只是这两个窗口传数据,其实没必要用DataTransfer类,直接把参数传给InfoDisplay的构造方法就行:
- 修改
LoginForm.java:
String mail,pass; // 存储邮箱和密码数据 if(op==true) { JOptionPane.showMessageDialog(null, "Login Successful!", "WebApp Database Login", INFORMATION_MESSAGE); // 直接把mail和pass传给InfoDisplay InfoDisplay id=new InfoDisplay(mail, pass); id.setVisible(true); }
- 修改
InfoDisplay.java的构造方法:
//Constructor public InfoDisplay(String email, String password) { initComponents(); // 显示当前日期时间 Calendar cl=Calendar.getInstance(); String datetime=cl.getTime().toString(); jLabel5.setText(datetime); // 直接使用传进来的参数 System.out.println("Email: "+email); System.out.println("Password: "+password); // 要是后续需要用,还可以把这俩存成类变量 }
方案三:把DataTransfer改成单例(适合多组件共享数据)
如果之后还有其他窗口/组件需要用到这些登录数据,把DataTransfer改成单例模式就很方便:
- 修改
DataTransfer.java为单例:
public class DataTransfer { // 全局唯一的实例 private static DataTransfer instance; private String loginEmail; private String loginPassword; // 私有构造方法,禁止外部直接new private DataTransfer() {} // 获取唯一实例的方法 public static DataTransfer getInstance() { if(instance == null) { instance = new DataTransfer(); } return instance; } // 原有getter和setter保留 public String getEmail() { return loginEmail; } public String getPassword() { return loginPassword; } public void setEmail(String email) { loginEmail=email; System.out.println("Stored Mail: "+loginEmail); } public void setPassword(String password) { loginPassword=password; System.out.println("Stored Pass: "+loginPassword); } }
LoginForm.java里用单例存数据:
String mail,pass; // 存储邮箱和密码数据 if(op==true) { JOptionPane.showMessageDialog(null, "Login Successful!", "WebApp Database Login", INFORMATION_MESSAGE); DataTransfer dt = DataTransfer.getInstance(); dt.setEmail(mail); dt.setPassword(pass); InfoDisplay id=new InfoDisplay(); id.setVisible(true); }
InfoDisplay.java里用单例取数据:
//Constructor public InfoDisplay() { initComponents(); // 显示当前日期时间 Calendar cl=Calendar.getInstance(); String datetime=cl.getTime().toString(); jLabel5.setText(datetime); // 获取全局唯一的DataTransfer实例 DataTransfer dt = DataTransfer.getInstance(); String finalEmail=dt.getEmail(); String finalPass=dt.getPassword(); System.out.println("Email: "+finalEmail); System.out.println("Password: "+finalPass); }
个人建议如果只是两个窗口传数据,方案二更简洁;如果有多个组件需要共享登录信息,方案三更合适~
内容的提问来源于stack exchange,提问作者Vaibhav Singh
相关产品推荐
相关产品推荐

