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
相关产品推荐
相关产品推荐

