JPasswordField KeyPress string length error?

2020-02-14 02:16发布

I am trying to change background colors of a JPasswordField in Java Swing (Netbeans).

Here's what I have:

private void pstxtPasswordKeyPressed(java.awt.event.KeyEvent evt) {                                         

    //Get string from password box
    userPassword = new String(pstxtPassword.getPassword());

    //If password is 8+ characters
    //(one less because string counting begins at 0)
    if (userPassword.length() >= 7) {

        //Set password input box background color to green
        pstxtPassword.setBackground(Color.green);
    }

    else { //If password is less than 8 characters

        //Set password input box background color to red
        pstxtPassword.setBackground(Color.red);
    }

}

Everything works, except when I backspace. When I backspace after typing 8+ characters, the color doesn't change back to red until there is only 5 characters left in the field.

Help would be appreciated, I am very new to java programming and Netbeans.

EDIT: I have changed my code,

    //If password is 8+ characters
    if ((pstxtPassword.getPassword()).length >= 8) {

        //Set password input box background color to green
        pstxtPassword.setBackground(Color.green);
    }

    else { //If password is less than 8 characters

        //Set password input box background color to red
        pstxtPassword.setBackground(Color.red);
    }

This code seems to make sense to me, but in testing, the color changes green at the 9th character; when backspacing, it changes back to red at 6. This seems to be the same problem I had when the code was >= 7 where the color changed green at the 8th character, but changed back to red at 5 characters.

After typing 9 characters, the component turns green

After typing 9 characters, the component turns green

After backspacing (starting from 9), component remains green until there are 6 characters

After backspacing (starting from 9), component remains green until there are 6 characters

This is strange, because I have similar code in a button in this program which displays an error message. That code works fine. Is this a KeyPress problem, perhaps something to do with the backspace key?

5条回答
Explosion°爆炸
2楼-- · 2020-02-14 02:46

Use

private void pstxtPasswordKeyReleased(java.awt.event.KeyEvent evt) 

Instead of

private void pstxtPasswordKeyPressed(java.awt.event.KeyEvent evt) 
查看更多
倾城 Initia
3楼-- · 2020-02-14 02:53

I solved the problem by using KeyRelease instead of KeyPress, try it out my friend

查看更多
地球回转人心会变
4楼-- · 2020-02-14 02:57
if (userPassword.length() >= 7)

This if statement doesn't match your comments:

//If password is 8+ characters

The actual code says if there are 7+ characters, then turn the background green. So when you are backspacing, it should turn the background red when you are down to 6 characters left.

I think your confusion is shown in this comment:

//(one less because string counting begins at 0)

What you are trying to describe is that indexing a character in a String starts at 0, for example when you use charAt() or subString(). This means that the first character is at index 0, the second at index 1, etc. On the other hand, length() returns the number of characters in the String. This is has nothing to do with the indexing, so you don't need to subtract 1.

查看更多
Anthone
5楼-- · 2020-02-14 03:01

Since JPasswordField extends from JTextComponent, you can attach a DocumentListener to it which is a far safer manner to update the background color on each change of the contents.

查看更多
混吃等死
6楼-- · 2020-02-14 03:05

As an aside, examine the length of the array returned by getPassword(), rather than the length of a String constructed from that array. The String is a security risk, as it will be stored for an indefinite time with the easily found name userPassword.

Addendum: Here's a related example of Robin's suggestion to use DocumentListener. I'm guessing that your key listener is seeing the KeyEvent before the JPasswordField has processed it.

查看更多
登录 后发表回答