2016-07-21 2 views
1

그래서 적어도 8 자 이상, 글자와 숫자 만, 최소 두 자릿수를 따라야하는 암호를 입력하라는 메시지를 사용자에게 표시해야합니다. 이제 내가 소리라고 믿는이 세 가지 요구 사항을 확인하기 위해 만든 메소드는 예외 처리를 수행하고 요구 사항 중 하나가 해제 된 경우 사용자에게 비밀번호를 다시 입력하도록 요청할 수 있어야하며 해당 오류 메시지를 표시해야합니다. 각 요구 사항을 따라 가십시오. 나는 그 메시지를 중계하기 위해 errorMessage라는 문자열을 만들었지 만, 내 주 (main)에서 그것을 호출하려고 할 때 오류가 발생합니까?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[]을 받아들이는 당신의 방법을 업데이트 할 수 있습니다.

오류 검사의 경우 예를 들어 ShortPasswordException extends Exception과 같은 클래스를 구현 한 후에 오류 검사를 수행하려는 곳에서 throw new ShortPasswordException()을 사용해야합니다.

그렇다면, 당신은 더 많은 모험을 위해

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

팁을 수행 할 수 있습니다 암호 요구 사항을 확인하기 위해 정규 표현식을 사용합니다. 예를 들어, \d{2}과 일치하면 두 자리 연속이라는 의미입니다. 바로 박쥐

1

두 가지 :

(1) 올바른 클래스를 가져 있는지 확인은 적절한 수입을하기 위해 IDE에 의존하지 않습니다. JavaFX에서 ActionEvent 클래스를 가져 오지만 작업중인 프레임 워크는 Swing입니다.

변경

import javafx.event.ActionEvent; 

import java.awt.event.ActionEvent; 

에 나는 서로 얼마나 잘 자바 FX와 스윙 플레이에 매우 익숙하지 않은,하지만 정확한 클래스를 사용하는 것은 일반적으로 두통을 방지하고/런타임 오류를 컴파일하는 데 도움이 .

(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); 
    } 
} 
관련 문제