【问题标题】:Java GUI Search Word From File Then ContinueJava GUI 从文件中搜索单词然后继续
【发布时间】:2018-05-01 12:34:44
【问题描述】:

我有一个用于用户登录的 GUI。

首先,用户创建他的帐户,该信息存储在.txt 文件中。我使用PrintWriter 在该文件中附加详细信息。 使用分隔符存储详细信息。我可以轻松地从文件中读取用户的每一个细节。

在登录 UI 中,JFrame 中有 2 个 JTtextField 组件,第一个用于用户名,第二个用于密码。

我使用 getText 方法获取值:

String user = user.getText();
String password = password.getText();

我尝试使用BufferedReader,但无法使用:

if(user.equals(br.readline))

我要做的是扫描文件,如果文件中的任何内容等于用户名(Frame 上用户的 getText),那么我想使用 SetVisible 转到下一帧

我的问题是,即使密码错误,用户也会进入新框架

我该如何解决这个问题?

用于检查用户和密码的代码,在 StackOverflow 上在线找到,现在仍然有效。

Scanner sc = new Scanner(new File("Details.txt"));
while(sc.hasNextLine()) {
    int val =0;
    String line = sc.nextLine();
    if(line.indexOf(user)   !=-1   && line.indexOf(pass)   !=-1) {
        JOptionPane.showMessageDialog(null,"Login");
        val = 1;
        vf.setVisible(true);
        break;
    } else {
        JOptionPane.showMessageDialog(null,"Invalid");
        val = 0;
        break;
    }
} 

在 for 中使用的另一个代码,即使在 do while 循环中,仍然无法正常工作。

File file  = new File("Details.txt");
BufferedReader br = new BufferedReader(new FileReader("Details.txt"));
String Line;      

do{
    if(user.equals(br.readLine()) && pass.equals(br.readLine())){
        vf.setVisible(true);
    } else {
        JOptionPane.showMessageDialog(null,"Invalid");
    }
}while((Line=br.readLine())  !=null )

这就是用户详细信息存储在我的文件中的方式。

=======================  
=======================  

 First Name = Ahmed Ali 
 Last Name = Qazi
 Address = Al-Abbass Colony pHase 2
 Phone Number = +92032329301
 Email Address = ahmedrider56@gmail.com
 UserName = ahmedfirst67
 Password = dangerd = 2hg

=======================  
=======================  







=======================  
=======================  

 First Name = Ahm345 
 Last Name = Qa345
 Address = Al-asfafs
 Phone Number = +92032329301
 Email Address = ahmgsdg
 UserName = ahmegg
 Password = dagg 

【问题讨论】:

  • 请添加检查文件的代码并将第二帧的可见性设置为您的问题,并提供txt文件中的一行示例。
  • @Bentaye Done 兄弟你现在可以查看

标签: java swing user-interface


【解决方案1】:

考虑到您的文件结构,这并不简单,但您可以这样做:

  • 扫描文件,直到找到用户名。
  • 找到用户名后,继续扫描直到到达密码行。
  • 读取此密码并退出扫描循环。
  • 然后将给定的密码与您在文件中找到的密码进行比较。

代码如下:

private static boolean checkCredentials(String user, String pass) throws IOException {

    Scanner sc = new Scanner(new File("Details.txt"));

    boolean userFound = false;
    String correctPassword = null;

    String line;
    while(sc.hasNextLine()) {
        line = sc.nextLine();
        // find the user
        if(!userFound) {
            userFound = line.contains("UserName = "+user);
        } else {
            // find the password
            if(line.contains("Password = ")) {
                correctPassword = line.substring(line.indexOf("=") + 2);
                break;
            }
        }
    }

    return correctPassword!=null && correctPassword.equals(pass);
}


public static void main(String[] args) throws IOException {
    System.out.println(checkCredentials("Bob", "dagg"));
    System.out.println(checkCredentials("ahmegg", "daggy"));
    System.out.println(checkCredentials("ahmegg", "dagg"));
}

打印出来:

false
false
true

像这样将它粘贴到您的代码中:

val = 0;
String message = "Invalid";
if(checkCredentials(user, pass)) {
    message = "Login";
    val = 1;
    vf.setVisible(true);
}
JOptionPane.showMessageDialog(null, message);

注意:

如果您以这种方式将详细信息存储在一行上会容易得多:

Ahmed Ali|Qazi|Al-Abbass Colony pHase 2|+92032329301|ahmedrider56@gmail.com|ahmedfirst67|dangerd = 2hg
Ahm345|Qa345|Al-asfafs|+92032329301|ahmgsdg|ahmegg|dagg 

您可以使用String.split 方法来解析每一行并同时获取用户和密码。

注意 2:

另外,存储未加密的密码也是非常糟糕的做法。如果这是一个学校练习,那很好,但如果它是一个现实生活中的项目,你可能想看看加密文件中的密码。

【讨论】:

  • 不,它不是真正的项目:P
  • 我知道密码应该加密:)
  • 但是我不希望值 true 和 false 我希望 Gui 转到下一个 Frame 如果 Useranme 和密码在文件中匹配,那么要放入 frame.setVisibile(true) 吗?跨度>
  • 好吧,如果它返回true,做vf.setVisible(true);,它返回false,什么都不做
  • @AHMEDALI 我编辑了答案,并举例说明了如何将其粘贴到您的代码中。
猜你喜欢
  • 1970-01-01
  • 2019-06-16
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多