2016-07-21 8 views
1

Also muss ich ein Programm schreiben, das den Benutzer auffordert, ein Passwort einzugeben, das drei Anforderungen erfüllen muss: mindestens 8 Zeichen lang, nur Buchstaben und Ziffern und mindestens zwei Ziffern. Die Methode, die ich erstellt habe, um diese drei Anforderungen zu überprüfen, ist meines Erachtens solide, aber mein Programm muss auch einige Ausnahmen behandeln und den Benutzer bitten, das Passwort erneut einzugeben, wenn eine der Voraussetzungen aus ist und die entsprechende Fehlermeldung angezeigt wird gehe mit jeder Anforderung mit. Ich habe eine Zeichenfolge errorMessage erstellt, um diese Nachricht weiterzuleiten, aber es gibt mir einen Fehler, wenn ich versuche, es in meinem Haupt zu nennen?Java JPasswordField

Mein anderes Problem ist, dass das Passwort in mein Programm mit JPasswordField übernommen werden muss, aber ich habe Mühe mit der Einrichtung sogar aufgrund der zahlreichen anderen Faktoren wie JPanel, Schaltflächen und Aktionsereignisse, die ich gelesen habe Komm damit klar. Ich versuchte, JPasswordField zu verwenden, und bemerkte, dass die Zeile, die das Kennwort eingibt, es als ein Array aufnimmt, wenn meine checkPassword-Methode eine Zeichenfolge benötigt, wie kann ich dieses Kennwort stattdessen als eine Zeichenfolge aufnehmen?

Dies ist, was ich für mein Programm haben bisher:

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; 
    } 
} 
} 

ich in fortgeschrittenen entschuldigen, falls einige meiner Fragen scheinen rudimentär wäre jede Hilfe sehr dankbar, danke!

+0

Haben Sie versucht, String Pass = neue Zeichenfolge (password); ' –

+0

oh wow duh, danke! setze das direkt nach der char [] Passwortzeile und der Fehler verschwand. Würdest du zufällig wissen, warum der Aufruf für die errorMessage einen Fehler erhält? –

+0

'errorMessage' ist nicht im Rahmen von' JOptionPane.showMessageDialog (frame, errorMessage) definiert; ' –

Antwort

1

Wie kann ich in diesem Kennwort als Zeichenfolge statt

Entweder checkPassword(new String(input.getPassword)) oder aktualisieren Sie Ihre Methode ein char[] anstelle eines String zu akzeptieren.

Zur Fehlerüberprüfung sollten Sie throw new ShortPasswordException() verwenden, wo Sie diesen Fehler auslösen möchten, nachdem Sie beispielsweise eine Klasse wie ShortPasswordException extends Exception implementiert haben.

Dann können Sie

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

Tipp für die Abenteurer tun: Verwenden Sie einen regulären Ausdruck Ihr Passwort Anforderungen zu überprüfen. Eine Übereinstimmung von \d{2} zum Beispiel bedeutet, dass Sie 2 aufeinanderfolgende Ziffern haben.

1

Zwei Dinge rechts von der Fledermaus:

(1) Stellen Sie sicher, dass Sie die richtigen Klassen importieren, beruhen nicht auf einem IDE richtige Importe zu tun. Sie importieren die ActionEvent-Klasse aus JavaFX, aber das Framework, mit dem Sie arbeiten, ist Swing.

ändern

import javafx.event.ActionEvent; 

Um

import java.awt.event.ActionEvent; 

Ich bin nicht sehr vertraut mit, wie schön JavaFX und Swing spielen miteinander, aber die richtigen Klassen hilft typischerweise Kopfschmerzen zu vermeiden und kompilieren/Laufzeitfehler .

(2) Eine statische Methode in der Klasse java.lang.String bietet eine praktische Möglichkeit, ein char-Array in eine Zeichenfolge zu konvertieren. In Ihrem actionPerformed Methode, fügen Sie diese:

String passStr = String.valueOf(password); 

Z.B.

@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); 
    } 
}