2016-07-21 8 views
1

Так что я должен написать программу, в которой пользователь вводит пароль, который должен соответствовать трем требованиям: длиной не менее 8 символов, только буквы и цифры и не менее двух цифр. Теперь метод, который я создал для проверки этих трех требований, которые, как мне кажется, звучат, но моя программа также должна выполнять некоторую обработку исключений и иметь возможность попросить пользователя повторно ввести пароль, если одно из требований отключено и отображает соответствующее сообщение об ошибке соглашайтесь с каждым требованием. Я создал строку errorMessage для ретрансляции этого сообщения, но он дает мне ошибку, когда я пытаюсь назвать это в моей главной?Java JPasswordField

Другая проблема заключается в том, что пароль должен быть применен к моей программе с помощью JPasswordField, но я боюсь даже настроить его из-за множества других факторов, таких как JPanel, кнопки и события действий, которые я читаю, соглашайтесь с этим. Я попытался использовать JPasswordField и заметил, что строка, которая берет пароль, принимает его как массив, когда мой метод checkPassword нуждается в строке, как я могу взять этот пароль как строку вместо этого?

Это то, что у меня есть для моей программы до сих пор:

import java.awt.event.ActionListener; 
    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JOptionPane; 
    import javax.swing.JPasswordField; 

    import javafx.event.ActionEvent; 

public class Ed10Chp6Ex6Point18CheckPasswordProgram { 

public static void main(String[] args) { 

    final JFrame frame = new JFrame("Check Password Program"); 
    JLabel jlbPassword = new JLabel("Please enter the password: "); 
    JPasswordField jpwName = new JPasswordField(15); 
    jpwName.setEchoChar('*'); 
    jpwName.addActionListener(new ActionListener()) { 

     public void actionPerformed(ActionEvent e) { 
      JPasswordField input = (JPasswordField) e.getSource(); 
      char[] password = input.getPassword(); 

      if(checkPassword(password)){ 
       JOptionPane.showMessageDialog(frame, "Congradulations, your password follows all the requirements"); 
      } 
      else{ 
       JOptionPane.showMessageDialog(frame, errorMessage); 
      } 
     } 
    } 
} 

public static boolean checkPassword(String x) { 

    String errorMessage = ""; 

    //must have at least eight characters 
    if (x.length() < 8){ 
     errorMessage = "The password you entered is invalid, password must be at least 8 characters"; 
     return false; 
    } 

    //consists of only letters and digits 
    for (int i = 0; i < x.length(); i++) { 
     if (!Character.isLetter(x.charAt(i)) && !Character.isDigit(x.charAt(i))) { 
      errorMessage = "The password you entered is invalid, password must contain only letters and digits"; 
     return false; 
     } 
    } 

    //must contain at least two digits 
    int count = 0; 
    for (int i = 0; i < x.length(); i++) { 
     if (Character.isDigit(x.charAt(i))){ 
     count++; 
     } 
    } 

    if (count >= 2){ 
     return true; 
    } 
    else { 
     errorMessage = "The password you entered is invalid, password must contain at least two digits"; 
     return false; 
    } 
} 
} 

Извиняется продвинут в случае, если некоторые из моих вопросов, кажется, рудиментарные, любая помощь будет принята с благодарностью, спасибо!

+0

ли вы попробовать 'Струнный пасс = новый String (пароль);' –

+0

о ничего себе Дух, спасибо! поместите это сразу после строки пароля char [], и ошибка исчезла. Не могли бы вы узнать, почему при вызове errorMessage возникает ошибка? –

+0

'errorMessage' не определен в пределах' JOptionPane.showMessageDialog (frame, errorMessage); ' –

ответ

1

, как я могу принять в этом пароль в виде строки вместо

Либо checkPassword(new String(input.getPassword)) или обновить свой метод, чтобы принять char[] вместо String.

Что касается проверки ошибок, вы должны использовать throw new ShortPasswordException(), где вы хотите бросить эту ошибку, например, после того, как вы реализуете класс, например ShortPasswordException extends Exception.

Затем вы можете сделать

try { 
    checkPassword(); 
} catch (ShortPasswordException e) { 
    // TODO: Handle exception 
} 

Совета для более авантюрного: Используйте регулярное выражение для проверки требования к паролям. Например, совпадение \d{2} означает, что у вас есть две последовательные цифры.

1

Две вещи сразу же:

(1) Убедитесь, что вы импортируете правильные классы, не полагаться на IDE, чтобы сделать надлежащий импорт. Вы импортируете класс ActionEvent из JavaFX, но структура, с которой вы работаете, - Swing.

Изменить

import javafx.event.ActionEvent; 

Для

import java.awt.event.ActionEvent; 

Я не очень хорошо знакомы с тем, как хорошо JavaFX и Swing-игры друг с другом, но используя правильные классы обычно помогает избежать головных болей и ошибки компиляции/времени выполнения ,

(2) Статический метод в классе java.lang.String обеспечивает удобный способ преобразования массива символов в строку. В вашем методе actionPerformed, добавьте это:

String passStr = String.valueOf(password); 

Э.Г.

@Override 
public void actionPerformed(ActionEvent e) { 
    // Get the source of the event, we know it is a JPasswordField so we cast it. 
    JPasswordField input = (JPasswordField) e.getSource(); 
    // Get the char array from the input the user typed stored in the input object. 
    char[] password = input.getPassword(); 
    // Convert char[] to String 
    String passwordStr = String.valueOf(password); 
    if(checkPassword(passwordStr)){ 
     JOptionPane.showMessageDialog(frame, "Congradulations, your password follows all the requirements"); 
    } else { 
     JOptionPane.showMessageDialog(frame, errorMessage); 
    } 
}