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

登录按钮点击后跳转至代理信息表单的实现问题求助

问题:登录验证通过后无法跳转至代理信息表单并显示信息

我希望点击登录按钮后打开代理信息表单,但目前无法实现。我有一张名为agent的表,包含User_Name、Password、First_Name和Last_Name字段。我获取用户输入的User_Name和Password进行登录验证,验证通过后需跳转至代理信息表单并显示信息。以下是我的登录按钮事件处理代码:

private void jButton1_LogInActionPerformed(java.awt.event.ActionEvent evt) { 
    Connection con = MyConnection.getConnection(); 
    PreparedStatement ps; 
    try { 
        ps=con.prepareStatement("Select * from agent WHERE User_Name = ? AND Password = ?"); 
        ps.setString(1, jTextField1_UserName.getText()); 
        ps.setString(2, String.valueOf(jPasswordField1.getPassword())); 
        ResultSet rs = ps.executeQuery(); 
        String Name = jTextField1_UserName.getText(); 
        if(rs.next()) { 
            String First_Name = rs.getString("First_Name"); 
            if(Name.equals(First_Name)) { 
                Agent_Info ag_info = new Agent_Info(); 
                ag_info.setVisible(true); 
                ag_info.pack(); 
                ag_info.setLocationRelativeTo(null); 
                this.dispose(); 
                //System.out.println("Yes"); 
            } 
        } 
    } catch (SQLException ex) { 
        Logger.getLogger(LoginForm.class.getName()).log(Level.SEVERE, null, ex); 
    }

请问如何完成该任务?


解决方案

我来帮你梳理问题并给出修复方案:

1. 找到核心问题:多余的错误判断

你代码里的关键问题在于,登录验证成功(rs.next()返回true)后,又加了一个if(Name.equals(First_Name))的判断——这完全是画蛇添足,而且逻辑错误!User_Name是用户登录用的账号,First_Name是用户的名字,这两个字段本来就不是同一个概念,除非你的所有用户的账号和名字完全一致,否则这个判断永远不会成立,自然也就跳不到代理信息表单。

2. 分步修复实现需求

步骤一:简化登录验证逻辑

直接去掉那个多余的判断,只要数据库查询到匹配的用户(rs.next()为true),就说明登录成功,直接跳转并传递用户信息:

if(rs.next()) { 
    // 从结果集里取出代理的所有信息
    String userName = rs.getString("User_Name");
    String firstName = rs.getString("First_Name");
    String lastName = rs.getString("Last_Name");
    
    // 创建代理信息表单实例,把数据传过去
    Agent_Info ag_info = new Agent_Info(userName, firstName, lastName); 
    ag_info.setVisible(true); 
    ag_info.pack(); 
    ag_info.setLocationRelativeTo(null); 
    this.dispose(); 
} else {
    // 可以在这里添加登录失败的提示,比如弹出对话框
    JOptionPane.showMessageDialog(this, "用户名或密码错误", "登录失败", JOptionPane.ERROR_MESSAGE);
}

步骤二:修改Agent_Info类,接收并展示数据

你需要给Agent_Info添加一个带参数的构造方法,用来接收登录成功后的用户信息,然后把这些信息显示在窗口里。比如假设你的Agent_Info里有三个文本框用来展示信息:

public class Agent_Info extends JFrame {
    private JTextField tfUserName;
    private JTextField tfFirstName;
    private JTextField tfLastName;

    // 带参数的构造方法,接收登录用户的信息
    public Agent_Info(String userName, String firstName, String lastName) {
        initComponents(); // 假设这是你初始化窗口组件的方法
        // 把数据设置到对应的组件上
        tfUserName.setText(userName);
        tfFirstName.setText(firstName);
        tfLastName.setText(lastName);
    }

    // 其他窗口初始化、事件处理代码...
}

步骤三:补充资源关闭的最佳实践

为了避免数据库连接泄漏,建议使用try-with-resources语法,自动关闭Connection、PreparedStatement和ResultSet:

private void jButton1_LogInActionPerformed(java.awt.event.ActionEvent evt) { 
    // try-with-resources会自动关闭括号内的资源
    try (Connection con = MyConnection.getConnection();
         PreparedStatement ps = con.prepareStatement("Select * from agent WHERE User_Name = ? AND Password = ?")) { 
        ps.setString(1, jTextField1_UserName.getText()); 
        ps.setString(2, String.valueOf(jPasswordField1.getPassword())); 
        try(ResultSet rs = ps.executeQuery()){
            if(rs.next()) { 
                String userName = rs.getString("User_Name");
                String firstName = rs.getString("First_Name");
                String lastName = rs.getString("Last_Name");
                
                Agent_Info ag_info = new Agent_Info(userName, firstName, lastName); 
                ag_info.setVisible(true); 
                ag_info.pack(); 
                ag_info.setLocationRelativeTo(null); 
                this.dispose(); 
            } else {
                JOptionPane.showMessageDialog(this, "用户名或密码错误", "登录失败", JOptionPane.ERROR_MESSAGE);
            }
        }
    } catch (SQLException ex) { 
        Logger.getLogger(LoginForm.class.getName()).log(Level.SEVERE, null, ex);
        JOptionPane.showMessageDialog(this, "数据库连接异常,请重试", "错误", JOptionPane.ERROR_MESSAGE);
    }
}

3. 额外的安全与代码规范建议

  • 永远不要明文存储密码:现在你的代码直接把密码存在数据库里,这是非常危险的做法。建议使用BCrypt等哈希算法,存储密码的哈希值,验证时对用户输入的密码做哈希后再和数据库里的值对比。
  • 给组件起有意义的名字:比如把jButton1改成btnLogin,jTextField1_UserName改成tfUserName,这样代码可读性会提升很多。

内容的提问来源于stack exchange,提问作者Rahat Batool

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:40:12