【问题标题】:How to remember user data after disposing a jFrame?处理 jFrame 后如何记住用户数据?
【发布时间】:2021-06-25 03:12:43
【问题描述】:

我正在创建允许您首先创建帐户的基本登录 GUI。创建后,您可以使用创建的用户名和密码并登录。我还有一个 logOut 按钮可以返回登录屏幕。但是,当我想重新登录时,我的凭据,用户名和密码没有保存,我已经重新注册了。(这没有意义)。处理登录框后如何才能记住用户名和密码。

登录代码:

private void btnLoginActionPerformed(java.awt.event.ActionEvent evt) {                                         
   String uName =txtfUserName.getText();
   String pass = passfPassword.getText();
   
    String signName = txtfSetUpUName.getText();
    String signPass = txtfSetUpPass.getText();
    
   if(uName.equals(signName) && pass.equals(signPass)){
       lblOutputMsg.setText("Access Granted");
        OptionsMenuFrame secondFrame = new OptionsMenuFrame();
        secondFrame.show();
        dispose();
       
      
       
   }else if(!uName.equals(signName) && !pass.equals(signPass)){
       lblOutputMsg.setText("Invalid Password/Username");
     
   } 
}    

有什么方法可以存储用户输入的数据并返回?

编辑:

登录代码:

  private void btnLoginActionPerformed(java.awt.event.ActionEvent evt) {                                         
   String uName = txtfUserName.getText();
   String pass = passfPassword.getText();
   
    String signName = txtfSetUpUName.getText();
    String signPass = txtfSetUpPass.getText();
    
   if(uName.equals(signName) && pass.equals(signPass)){
       lblOutputMsg.setText("Access Granted");
        OptionsMenuFrame secondFrame = new OptionsMenuFrame();
        secondFrame.show();
        //dispose(); using setVisible instead of DISPOSE
        MainFrame firstFrame = new MainFrame();
        firstFrame.setVisible(false);
      
       
   }else if(!uName.equals(signName) && !pass.equals(signPass)){
       lblOutputMsg.setText("Invalid Password/Username");
     
   } 
}    

注销代码:

private void btnLogOutActionPerformed(java.awt.event.ActionEvent evt) {                                          
     dispose();
     MainFrame firstFrame = new MainFrame();
     firstFrame.setVisible(true);
     
}                                         
                                
 

登录按钮和注销按钮后面的代码没有相互链接,并且位于两个单独的 jFrame 上。是否仍然可以在不打开全新的登录屏幕的情况下返回原始登录屏幕?

【问题讨论】:

  • 您是否考虑过使用数据库(例如 MySQL)来存储注册用户的用户名和密码?
  • “之后”是什么意思?您是否需要在程序运行之间或在您销毁框架之后记住它(以便您可以在程序的其他部分使用它)?在后一种情况下,您是否考虑过...将值分配给变量?
  • 有什么方法可以存储用户输入的数据并返回?保存到文件中?
  • 您可以使用global variablesstatic strings 但这会在应用程序关闭时删除数据,如果您想永久存储它可以使用任何数据库

标签: java


【解决方案1】:

为了永久存储用户凭据,您应该使用数据库。 MySQL 通常是一个好的开始。在用户创建帐户的文件中,将操作侦听器连接到“创建帐户”按钮:

create.addActionListener(new ActionListener()    {
        @SuppressWarnings("deprecation")
        public void actionPerformed(ActionEvent e) {
            // get entered userName
            // get entered password
            // information successfully added to user database
             if(DatabaseManager.insertInUserDatabase(userName, password))
             {
                // navigate to logged screen
             }
        }           
    });

DatabaseManager 类中将用户凭据插入数据库的函数应如下所示:

public static boolean insertInUserDatabase(String username, String password)
{
    boolean added = false;
    int i = 0;
    try {
        //defining database driver to use
        Class.forName("com.mysql.jdbc.Driver");
        
        Connection con = DriverManager.getConnection(
                "jdbc:mysql://localhost:3308/UserDatabase", "root", "");
        
        PreparedStatement oPrStmt = con
                .prepareStatement("insert into  User (username,password)  
                 values(?,?)");
                                                                                        
        oPrStmt.setString(1, username);// parameter index start from 1
        oPrStmt.setString(2, password);
        i = oPrStmt.executeUpdate(); // executing the query and getting the 
           resultset from databse
        if(i == 1)
            added = true;
    
    } catch (Exception e) {
        System.out.println(e);
    }
    return added;
}

然后,下次启动应用程序或注销时,您可以使用之前创建的凭据登录,而无需再次注册:

logIn.addActionListener(new ActionListener()  {
     public void actionPerformed(ActionEvent e)
     {
        // get entered username
        // get entered password
        // if log in validation is successful
        if(DatabaseManager.validateLogIn(username, password))
        {
             // navigate to logged screen
        }
        else   // log in validation failed
        {
               // display error message
        }       
       }
    });

DatabaseManager 类中的 ValidateLogIn 方法应如下所示:

public static boolean validateLogIn(String name, String pass) {
    boolean validLogin = false;
    try {
        //defining database driver to use
        Class.forName("com.mysql.jdbc.Driver");
        
        Connection con = DriverManager.getConnection(
                "jdbc:mysql://localhost:3308/UserDatabase", "root", "");
        
        PreparedStatement oPrStmt = con
                .prepareStatement("select * from User where username=? and  
                 password=?");                                                                                          
        oPrStmt.setString(1, name);// parameter index start from 1
        oPrStmt.setString(2, pass);
        ResultSet rs = oPrStmt.executeQuery();
            
        if (rs.next()) { //checking if the resultset has any value?   
            validLogin = true;
        }
    
    } catch (Exception e) {
        System.out.println(e);
    }
    return validLogin;
}

希望这会有所帮助!随时提问。

【讨论】:

  • 很好的答案。 OP的问题非常广泛,但我认为OP有两个问题,1)如何保持注册(你回答得很好),2)如何选择现有用户名来自动填写用户名和密码框,你能提供吗关于它如何工作的任何建议?
  • 有什么方法可以简单地隐藏登录屏幕而不是完全破坏它(处置)?这样,Jframe 永远不会关闭,只会隐藏,以便记住凭据以供以后使用。
  • 您可以使用 screen.setVisible(false) 方法隐藏屏幕,使用 screen.setVisible(true) 方法再次显示。如果您不想使用数据库,您还可以将凭据保存在静态(全局)变量中,但是当您关闭应用程序时,这些值将消失(数据库选项不是这种情况 - 凭据插入到数据库中将被永久存储,并且可以在每次运行应用程序时使用)。
  • set visible 方法将框架放在新的 Jframe 后面。因此,当我按下注销时,它会打开登录屏幕,但没有保存任何凭据,但我也有隐藏的原始登录屏幕(已保存所有内容)。有什么办法可以只打开原始框架而不是全新的登录屏幕。
  • 如果不实际查看您的代码,很难说出发生了什么。从您所说的来看,我怀疑当您单击注销按钮时,您可能正在创建并显示一个新的登录屏幕(您不应该这样做)。相反,您应该通过其名称引用原始登录屏幕并在该原始屏幕上调用 setVisible(true) 方法。
猜你喜欢
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多