6

我正在尝试更改 Java Swing (Netbeans) 中 JPasswordField 的背景颜色。

这是我所拥有的:

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);
    }

}

一切正常,除非我退格。当我在输入 8 个以上字符后退格时,颜色不会变回红色,直到字段中只剩下 5 个字符。

帮助将不胜感激,我对 Java 编程和 Netbeans 非常陌生。

编辑:我改变了我的代码,

    //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);
    }

这段代码对我来说似乎很有意义,但在测试中,颜色在第 9 个字符处变为绿色;退格时,它在 6 处变回红色。这似乎与我遇到的问题相同,因为代码>= 7在第 8 个字符处颜色变为绿色,但在 5 个字符处变回红色。

输入 9 个字符后,组件变为绿色

输入 9 个字符后,组件变为绿色

退格后(从 9 开始),组件保持绿色,直到有 6 个字符

退格后(从 9 开始),组件保持绿色,直到有 6 个字符

这很奇怪,因为我在这个程序的一个按钮中有类似的代码,它显示一条错误消息。该代码工作正常。这是一个 KeyPress 问题,也许与退格键有关?

4

5 回答 5

8

顺便说一句,检查由 返回的数组的长度getPassword(),而不是String从该数组构造的 a 的长度。这String是一个安全风险,因为它将以容易找到的名称无限期地存储userPassword

附录:这是Robin建议使用的相关示例。我猜你的主要听众在处理它之前就看到了。DocumentListenerKeyEventJPasswordField

于 2012-10-19T02:23:16.063 回答
8

由于JPasswordFieldextends from JTextComponent,您可以将 a 附加DocumentListener到它,这是一种更安全的方式来更新每次内容更改时的背景颜色。

于 2012-10-19T06:24:32.140 回答
7
if (userPassword.length() >= 7)

此 if 语句与您的评论不符:

//如果密码是8+个字符

实际代码说如果有 7+ 个字符,则将背景变为绿色。所以当你退格时,当你剩下 6 个字符时,它应该把背景变成红色。

我认为您的困惑显示在此评论中:

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

您要描述的是索引a 中的字符从String开始0,例如当您使用charAt()or时subString()。这意味着第一个字符在 index 处0,第二个在 index 处1,依此类推。另一方面,length()返回String. 这与索引无关,因此您不需要减去 1。

于 2012-10-19T02:14:48.950 回答
0

我通过使用 KeyRelease 而不是 KeyPress 解决了这个问题,试试我的朋友

于 2015-06-26T20:19:48.840 回答
0

采用

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

代替

private void pstxtPasswordKeyPressed(java.awt.event.KeyEvent evt) 
于 2017-10-16T09:17:13.657 回答