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 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.