如何将String类型的Role值传递到另一类以控制FXML控件显隐
解决方案
方案1:FXML控制器传参(推荐)
这是JavaFX场景下跨控制器传参的标准实现方式,流程如下:
- 修改登录类逻辑
首先修改verifyLogin方法,拿到角色后将参数传入页面跳转方法:
补充实现带参数的public void verifyLogin() { DatabaseConnection connectNow = new DatabaseConnection(); Connection connectDB = connectNow.getConnection(); // 注:原SQL拼接存在注入风险,建议后续替换为PreparedStatement String verifyLogin = "SELECT * FROM Account WHERE username = '" + enterUsername.getText() + "'AND password = '" + enterPassword.getText() + "'"; try{ Statement statement = connectDB.createStatement(); ResultSet queryResult = statement.executeQuery(verifyLogin); if (queryResult.next()){ String role = queryResult.getString(5); System.out.println(role); // 跳转时传入角色参数 validateLogin(role); }else{ loginMessageLabel.setText("账号或密码错误"); } queryResult.close(); }catch (Exception e){ e.printStackTrace(); } }validateLogin跳转方法,加载FXML时获取第二个页面的控制器实例传参:private void validateLogin(String role) throws IOException { // 替换为你的第二个页面对应的FXML路径 FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/mainPage.fxml")); Parent root = loader.load(); // 获取第二个页面的控制器对象 SecondPageController controller = loader.getController(); // 调用控制器的set方法传入角色 controller.setUserRole(role); // 正常切换场景 Stage currentStage = (Stage) enterUsername.getScene().getWindow(); currentStage.setScene(new Scene(root)); currentStage.show(); } - 修改第二个控制类逻辑
给第二个类加角色存储的成员变量、set方法,将原来写在initialize里的显隐判断逻辑抽为独立方法:public class SecondPageController { // 新增成员变量存储角色 private String userRole; // 新增set方法接收传入的角色 public void setUserRole(String userRole) { this.userRole = userRole; // 角色传入后再执行组件显隐逻辑 updateComponentVisibility(); } public void initialize(URL url, ResourceBundle resourceBundle) { //Welkom bericht String AB = AccountNameLabel.getText(); System.out.println(AB); // 图片加载逻辑保留不变 File brandingFile = new File("images/logo.png"); Image brandingImage = new Image(brandingFile.toURI().toString()); brandingImageView.setImage(brandingImage); File LoginFile = new File("images/icon.png"); Image LoginImage = new Image(LoginFile.toURI().toString()); LoginImageView.setImage(LoginImage); File CalendarFile = new File("images/KalenderAanvraag.png"); Image CalendarImage = new Image(CalendarFile.toURI().toString()); CalenderImageView.setImage(CalendarImage); File OverviewFile = new File("images/KalenderOverzicht.png"); Image OverviewImage = new Image(OverviewFile.toURI().toString()); OverviewImageView.setImage(OverviewImage); File DeleteUserFile = new File("images/Verwijderen.png"); Image DeleteUserImage = new Image(DeleteUserFile.toURI().toString()); DeleteUserImageView.setImage(DeleteUserImage); File AddUserFile = new File("images/AccountToevoegen.png"); Image AddUserImage = new Image(AddUserFile.toURI().toString()); AddUserImageView.setImage(AddUserImage); } // 抽离的组件显隐控制方法 private void updateComponentVisibility() { if (userRole.contains("Tester")){ DeleteUserImageView.setVisible(false); AddUserImageView.setVisible(false); }else{ DeleteUserImageView.setVisible(true); AddUserImageView.setVisible(true); } } }
方案2:静态变量中转(临时快速实现用)
如果不想调整跳转逻辑,可以用静态变量临时存储角色,不推荐长期使用,存在全局变量污染风险:
- 在登录类中新增公共静态变量:
public class LoginController { public static String loginUserRole; // 其他原有逻辑不变 } - 拿到角色后给静态变量赋值:
if (queryResult.next()){ String role = queryResult.getString(5); LoginController.loginUserRole = role; validateLogin(); } - 第二个类中直接读取静态变量即可,注意做空指针判断。
注意事项
- 原有SQL直接拼接用户输入的账号密码,存在SQL注入风险,建议后续替换为
PreparedStatement预编译SQL实现查询 - Java变量命名推荐使用小驼峰格式,首字母小写,例如
Role改为role更符合编码规范 - 图片资源加载建议使用
Class.getResource()方式,避免打包成JAR包后File读取不到资源路径的问题
内容的提问来源于stack exchange,提问作者KvdE_
相关产品推荐
相关产品推荐

