JavaFX满足条件时如何切换场景?登录成功跳转Dashboard失效如何解决
问题原因分析
- 核心故障点:你在
validatelogin方法中调用switchtoSC1(null)传入了空参数,执行switchtoSC1内的event.getSource()代码时会直接触发NullPointerException,方法直接中断运行,自然无法完成场景跳转,你可以查看IDE控制台,会有对应的空指针异常报错信息。 - 次要隐患:你的JDBC驱动加载顺序错误,
Class.forName("com.mysql.jdbc.Driver")需要放在DriverManager.getConnection之前,否则可能出现驱动未注册的异常。
修复方案
方案1:修改switchtoSC1方法,不依赖ActionEvent参数
不需要传入事件对象,直接用登录页已有的控件获取窗口即可,比如你代码中已经声明的loginmessagelabel控件:
public void switchtoSC1() throws IOException { Parent root = FXMLLoader.load(getClass().getResource("Dashboard.fxml")); // 直接从当前页面现有控件获取窗口,不需要事件对象 stage = (Stage) loginmessagelabel.getScene().getWindow(); scene = new Scene(root); stage.setScene(scene); stage.show(); }
对应调用处修改为switchtoSC1();,不需要再传null参数。
方案2:保留ActionEvent参数,调用时传入合法事件对象
如果你的validatelogin方法是绑定给登录按钮的点击事件的,可以直接给validatelogin增加ActionEvent参数,调用时直接传入该参数即可:
// 方法签名增加ActionEvent参数,绑定按钮点击事件时会自动传入该对象 public void validatelogin(ActionEvent event) throws SQLException, ClassNotFoundException, IOException { // 原有业务代码不变 String jdbcURL = "jdbc:mysql://localhost/medibase"; String dbUsername = "root"; String dbPassword = "0852"; // 修正驱动加载顺序 Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection(jdbcURL,dbUsername,dbPassword); String uname = username1.getText(); String psd = password1.getText(); pst=connection.prepareStatement("SELECT * FROM user_account WHERE username=? and password=?"); pst.setString(1, uname); pst.setString(2, psd); rs = pst.executeQuery(); if(rs.next()){ switchtoSC1(event); // 传入合法的事件对象 } else{ loginmessagelabel.setText("Login failed"); } // 建议用完主动关闭数据库连接、PreparedStatement、ResultSet }
额外优化建议
- 不要在代码中硬编码数据库连接账号密码,建议放到独立配置文件中管理
- 数据库不要明文存储用户密码,建议加密后再存储比对
- 数据库连接、ResultSet、PreparedStatement使用完要及时关闭,避免资源泄漏
内容的提问来源于stack exchange,提问作者banchiSL
相关产品推荐
相关产品推荐

