Неправильное поведение с моей системой входа в JFrame и JDialog

#java #jframe #joptionpane #jdialog

#java #jframe #joptionpane #jdialog

Вопрос:

Я внедрил базовую систему входа в систему, которая разбивает текстовый файл (имя: фамилия: Город: имя пользователя: пароль)

Гарольд: Фишер: Сан-Франциско: hf45: 1234

Когда пользователь вводит свои учетные данные, будет отображаться JFrame, если учетные данные введены правильно, в противном случае вместо этого появится панель JOptionPane, информирующая пользователя о том, что введенные учетные данные неверны.

Вот мой код:

 public class LoginFrame extends javax.swing.JFrame      {

/**
 * Creates new form LoginFrame
 */ 
String username;
String password;
String filePath = "UserDetails.txt";

public LoginFrame() {
    initComponents();


private void jButtonLoginActionPerformed(java.awt.event.ActionEvent evt) {                                             

        username = jTextFieldUsername.getText();
        password = jTextFieldPassword.getText();
        verifyLogin();  
}                                            

public void verifyLogin()
{
   try {
       File f = new File("UserDetails.txt");
       Scanner fileRead = new Scanner(f);

       while(fileRead.hasNextLine())
       {
           String textLine = fileRead.nextLine();
           String[] userDetails = textLine.split(" : ");
           String tempUsername = userDetails[3];
           String tempPassword = userDetails[4];

           if(tempUsername.trim().equals(username.trim()) amp;amp; tempPassword.trim().equals(password.trim()))
                   {
                       new LibraryCatalogFrame().setVisible(true);
                   }
           else
           {
               JOptionPanes.messageBox("Please re-enter your user details", "Incorrect Username or Password");
         }
        }
       }
       catch (FileNotFoundException e)
               {
               JOptionPanes.messageBox("Error", "FileNotFound");
          }
       }
  

Проблема, с которой я сталкиваюсь прямо сейчас, заключается в том, что, когда пользователь правильно вводит свои учетные данные, отображаются оба JFrame и JOptionPane. Кроме того, когда пользователь неправильно вводит свои учетные данные, JFrame не отображается (как предполагалось), но JOptionPane появляется дважды, а не только один раз.

Комментарии:

1. Имеет ли UserDetails.txt файл больше строк?

Ответ №1:

Я наблюдал поведение, которое вы объясняете, когда UserDetails.txt файл состоит из двух строк. Например.

Гарольд: Фишер: Сан-Франциско: hf45: 1234
Джон : Сноу: Сан-Франциско: js45 : 5678

В приведенном выше файле с двумя строками ниже «Program with the problem» выводится поведение, которое вы объясняете (печатаются как «Показать JFrame», так и «Показать диалоговое окно»).

Проблема в том, что в while цикле вы пытаетесь отобразить JFrame диалоговое окно для каждой строки в файле.

Попробуйте ниже «Исправленная программа». При этом я использую boolean переменную matched для сохранения того, найдено ли совпадение. А затем покажите JFrame диалоговое окно or после while цикла.

Программа с проблемой:

 import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class LoginFrame
{
  // Hardcode user entered username and password to simplify the program
  String username = "hf45";
  String password = "1234";

  public static void main(String[] args)
  {
    new LoginFrame().verifyLogin();
  }

  public void verifyLogin()
  {
    try {
      File f = new File("UserDetails.txt");
      Scanner fileRead = new Scanner(f);

      while(fileRead.hasNextLine())
      {
        String textLine = fileRead.nextLine();
        String[] userDetails = textLine.split(" : ");
        String tempUsername = userDetails[3];
        String tempPassword = userDetails[4];

        if(tempUsername.trim().equals(username.trim()) amp;amp; tempPassword.trim().equals(password.trim()))
        {
          //new LibraryCatalogFrame().setVisible(true);
          System.out.println("Show JFrame");
        }
        else
        {
          System.out.println("Show dialog");
          //JOptionPanes.messageBox("Please re-enter your user details", "Incorrect Username or Password");
        }
      }
    }
    catch (FileNotFoundException e)
    {
      e.printStackTrace();
      //JOptionPanes.messageBox("Error", "FileNotFound");
    }
  }
}
  

Вывод:
Показать JFrame
Показать диалоговое окно

Исправлена программа:

 import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class LoginFrame
{
  // Hardcode user entered username and password to simplify the program
  String username = "hf45";
  String password = "1234";

  public static void main(String[] args)
  {
    new LoginFrame().verifyLogin();
  }

  public void verifyLogin()
  {
    try {
      File f = new File("UserDetails.txt");
      Scanner fileRead = new Scanner(f);

      boolean matched = false;
      while(fileRead.hasNextLine())
      {
        String textLine = fileRead.nextLine();
        String[] userDetails = textLine.split(" : ");
        String tempUsername = userDetails[3];
        String tempPassword = userDetails[4];

        if(tempUsername.trim().equals(username.trim()) amp;amp; tempPassword.trim().equals(password.trim()))
        {
          matched = true;
          break;
        }
      }

      if (matched)
      {
        //new LibraryCatalogFrame().setVisible(true);
        System.out.println("Show JFrame");
      }
      else
      {
        System.out.println("Show dialog");
        //JOptionPanes.messageBox("Please re-enter your user details", "Incorrect Username or Password");
      }
    }
    catch (FileNotFoundException e)
    {
      e.printStackTrace();
      //JOptionPanes.messageBox("Error", "FileNotFound");
    }
  }
}