JPasswordField KeyPress Ошибка длины строки?

Я пытаюсь изменить цвета фона JPasswordField в Java Swing (Netbeans).

Вот что у меня есть:

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), компонент остается зеленым, пока не будет 6 символов

Это странно, потому что у меня есть подобный код в кнопке в этой программе, которая отображает сообщение об ошибке. Этот код работает отлично. Это проблема KeyPress, возможно, это связано с клавишей Backspace?

Ответы на вопрос(5)

JPasswordField простирается отJTextComponentВы можете прикрепитьDocumentListener это гораздо более безопасный способ обновления цвета фона при каждом изменении содержимого.

 trashgod20 окт. 2012 г., 14:35
+1 заDocumentListener.
Решение Вопроса

getPassword(), а не длинаString построен из этого массива.String представляет собой угрозу безопасности, поскольку он будет храниться в течение неопределенного времени с легко найденным именемuserPassword.

Приложение: вот связанныйпример Робинапредложение использоватьDocumentListener, Я предполагаю, что ваш ключевой слушатель видитKeyEvent передJPasswordField обработал это.

 jessechk20 окт. 2012 г., 06:41
Спасибо, я изменил это.
 trashgod20 окт. 2012 г., 14:35
@Jaybob: вот связанныйпример предложение Робина использоватьDocumentListener, Я предполагаю, что ваш ключевой слушатель видитKeyEvent передJPasswordField обработал это.

использование

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

Вместо

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

попробуйте это мой друг

if (userPassword.length() >= 7)

// Если пароль 8+ символов

Фактический код говорит, что если есть 7+ символов, то фон зеленый. Поэтому, когда вы возвращаетесь назад, фон должен становиться красным, если осталось до 6 символов.

Я думаю, что ваше замешательство показано в этом комментарии:

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

То, что вы пытаетесь описать этоиндексирование персонаж вString начинается в0Например, когда вы используетеcharAt() или жеsubString(), Это означает, что первый символ находится в индексе0вторая по индексу1и т. д. С другой стороны,length() возвращает количество символов вString, Это никак не связано с индексацией, поэтому вам не нужно вычитать 1.

 Code-Apprentice20 окт. 2012 г., 19:52
@Jaybob Чтобы отладить этот код, я бы начал с вывода значенияuserPassword чтобы убедиться, что это то, что вы ожидаете.
 jessechk20 окт. 2012 г., 06:29
Итакlength() возвращает количество символов в строке. У меня изначально былif (userPassword.length() >= 8, Однако после тестирования, когда я набрал 8 символов, фон все еще был красным, когда я набрал 9-й символ, фон изменится на зеленый. Я изменил это на>= 7 и это почему-то сработало. Я до сих пор не могу понять, почему он остается зеленым, пока не возвращаюсь к 5 символам. Спасибо за вашу помощь, хотя.

Ваш ответ на вопрос