2016-07-21 11 views
1

パスワードを入力するように要求するプログラムを作成する必要があります。少なくとも8文字、英字と数字のみ、少なくとも2桁の3つの要件に従わなければなりません。今私が考えている3つの要件を確認するために作成したメソッドですが、私のプログラムでは例外処理を行う必要があり、要件の1つがオフになっている場合にパスワードを再入力するようユーザーに依頼する必要があります。各要件に沿って進んでください。私はそのメッセージを中継する文字列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 pass = new String(password);を試しましたか? –

+0

oh wow duh、ありがとうございました! char []パスワード行の直後に置いてください。エラーが消えました。 errorMessageの呼び出しでエラーが発生する理由を知りたいですか? –

+0

'errorMessage'は' JOptionPane.showMessageDialog(frame、errorMessage);のスコープ内に定義されていません –

答えて

1

は、どのように私は、文字列の代わりに

どちらかcheckPassword(new String(input.getPassword))として、そのパスワードで取るか、代わりに文字列のchar[]を受け入れるためにあなたの方法を更新することができます。

エラーチェックの場合は、たとえばShortPasswordException extends Exceptionのようなクラスを実装した後に、エラーをスローしたい場合はthrow new ShortPasswordException()を使用する必要があります。パスワードの要件を確認するために、正規表現を使用します。

その後、あなたはより多くの冒険のための

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

ヒントを行うことができます。例えば、\d{2}の一致は、2桁連続していることを意味します。右バットオフ

1

2つのこと:

(1)あなたは正しいクラスをインポートしていることを確認し、適切な輸入を行うには、IDEに依存していません。あなたはJavaFXからActionEventクラスをインポートしていますが、作業しているフレームワークはSwingです。

変更

import javafx.event.ActionEvent; 

import java.awt.event.ActionEvent; 

へ私が互いにどのようにきれいにJavaFXのとSwing遊びに精通していないですが、正しいクラスを使用すると、一般的に頭痛を避け、/ランタイムエラーをコンパイルするのに役立ちます。

(2)java.lang.Stringクラスの静的メソッドは、char配列を文字列に変換する便利な方法を提供します。あなたの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); 
    } 
} 
関連する問題