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 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?
As an aside, examine the length of the array returned by
getPassword(), rather than the length of aStringconstructed from that array. TheStringis a security risk, as it will be stored for an indefinite time with the easily found nameuserPassword.Addendum: Here's a related example of Robin's suggestion to use
DocumentListener. I'm guessing that your key listener is seeing theKeyEventbefore theJPasswordFieldhas processed it.