You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Swing跨JFrame传递邮箱密码时出现NULL值问题求助

嘿,我一眼就瞅出问题所在啦!你在LoginForm里创建了一个DataTransfer实例存数据,但在InfoDisplay的构造方法里又重新new了一个全新的DataTransfer对象——这俩完全是独立的实例,后者自然拿不到前者存的数据咯!

下面给你几个实用的解决方案,你可以根据需求选:

方案一:直接把DataTransfer实例传给InfoDisplay

这是最贴合你现有代码结构的改法,核心就是让两个窗口用同一个DataTransfer对象:

  1. 修改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);
}
  1. 修改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的构造方法就行:

  1. 修改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);
}
  1. 修改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改成单例模式就很方便:

  1. 修改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);
    }
}
  1. 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);
}
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 00:23:13