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

JavaFX项目中如何将Login类的登录邮箱传递至BookFlightsController使用

解决JavaFX登录邮箱传递到航班预订控制器的方案

问题根源:你之前在登录方法中手动new BookFlightsController()传值的方式无效,因为FXML加载页面时会自动生成全新的控制器实例,你手动创建的实例和页面实际绑定的实例不是同一个对象,所以赋值后拿不到值。以下提供两种可直接落地的实现方案:


方案1:用已有的Loginset类做全局单例存储(改动最少)

直接把你封装的Loginset改成单例,全局唯一实例存储登录邮箱,所有页面都可以直接取值:

第一步:修改Loginset类为单例模式

package myFlight;

public class Loginset {
    // 全局唯一实例
    private static final Loginset INSTANCE = new Loginset();
    private String userEmail;

    // 构造方法私有,禁止外部手动创建实例
    private Loginset() {
        
    }
    
    // 对外提供获取唯一实例的方法
    public static Loginset getInstance() {
        return INSTANCE;
    }
    
    public String getUserEmail() {
        return userEmail;
    }
    
    public void setUserEmail(String userEmail) {
        this.userEmail = userEmail;
    }
}

第二步:登录成功时存储邮箱

修改Login类的VerifyLogin方法,普通用户登录验证通过时存入邮箱:

else if (psw.equals(enteredPassword) && admin.equals("No")) {
    // 登录成功先存邮箱
    Loginset.getInstance().setUserEmail(enteredEmail);
    LoginComplete();
} 

同时删除Login方法里无效的两行代码:

// 以下两行直接删掉,手动new的控制器和页面绑定的不是同一个实例
BookFlightsController callClass = new BookFlightsController();
callClass.usersEmail(enteredEmail);

第三步:BookFlightsController中直接取值

在bookAFlight方法里直接从单例拿邮箱即可:

public void bookAFlight(ActionEvent event) {
    // 直接获取登录用户邮箱
    String loginUserEmail = Loginset.getInstance().getUserEmail();
    flightTable selectedFlight = table.getSelectionModel().getSelectedItem();
    // 原有业务逻辑不变
}

方案2:FXML加载时直接给控制器传值(符合JavaFX开发规范)

不需要依赖全局单例,加载用户页面时直接把邮箱传给对应控制器:

第一步:给BookFlightsController新增邮箱赋值方法

// 放在BookFlightsController类里即可
public void setUserEmail(String userEmail) {
    this.userEmail = userEmail;
}

第二步:修改Login类的LoginComplete方法

把原来的静态加载FXML改成获取FXMLLoader实例,拿到控制器后传值:

// 方法新增入参接收登录邮箱
public void LoginComplete(String loginEmail) {
    try {
        Stage login = new Stage();
        // 不要用静态load方法,先创建FXMLLoader实例
        FXMLLoader loader = new FXMLLoader(getClass().getResource("CustomerInterface.fxml"));
        Parent root = loader.load();
        // 获取页面绑定的控制器实例
        BookFlightsController controller = loader.getController();
        // 给控制器传邮箱
        controller.setUserEmail(loginEmail);
        Scene returnToLogin = new Scene(root, 800, 600);
        returnToLogin.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
        login.setScene(returnToLogin);
        login.show();
    } catch (Exception f) {
        f.printStackTrace(); // 建议加异常打印,方便排错
    }
}

第三步:调用LoginComplete时传入邮箱

修改VerifyLogin里调用LoginComplete的代码:

else if (psw.equals(enteredPassword) && admin.equals("No")) {
    LoginComplete(enteredEmail);
} 

之后你在BookFlightsController的任意方法(包括bookAFlight)里都可以直接用成员变量userEmail获取登录邮箱。


内容的提问来源于stack exchange,提问作者Dustin Willingham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:39:01