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 で赤に戻ります。これは、コードが>= 78 文字目で色が緑に変わったときに発生した問題と同じようですが、5 文字で赤に戻ります。

9 文字を入力すると、コンポーネントが緑色に変わります

9 文字を入力すると、コンポーネントが緑色に変わります

バックスペース (9 から開始) の後、コンポーネントは 6 文字になるまで緑色のままです。

バックスペース (9 から開始) の後、コンポーネントは 6 文字になるまで緑色のままです。

エラーメッセージを表示するこのプログラムのボタンに同様のコードがあるため、これは奇妙です。そのコードは正常に動作します。これは KeyPress の問題ですか、おそらくバックスペース キーと関係がありますか?

4

5 に答える 5

8

からJPasswordField拡張されているので、コンテンツを変更するたびに背景色を更新するためのはるかに安全な方法であるをJTextComponent添付できます。DocumentListener

于 2012-10-19T06:24:32.140 に答える
8

余談ですが、その配列から構築されgetPassword()た の長さではなく、によって返される配列の長さを調べてください。StringこれStringは、簡単に見つけられる名前で無期限に保存されるため、セキュリティ上のリスクがありますuserPassword

補遺:これは、使用するロビンの提案の関連です。あなたの主要なリスナーは、が処理する前にを見ていると思います。DocumentListenerKeyEventJPasswordField

于 2012-10-19T02:23:16.063 に答える
7
if (userPassword.length() >= 7)

このifステートメントはあなたのコメントと一致しません:

//パスワードが8文字以上の場合

実際のコードでは、7 文字以上ある場合は背景を緑色にします。したがって、バックスペースを使用している場合、残り 6 文字になると背景が赤くなります。

あなたの混乱はこのコメントに示されていると思います:

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

あなたが説明しようとしているのは、たとえば、またはを使用する場合など、で始まる文字のインデックス付けです。これは、最初の文字が indexにあり、2 番目の文字が index にあるということを意味します。一方、の文字数を返します。これはインデックスとは関係がないため、1 を引く必要はありません。String0charAt()subString()01length()String

于 2012-10-19T02:14:48.950 に答える
0

KeyPress の代わりに KeyRelease を使用して問題を解決しました。試してみてください。

于 2015-06-26T20:19:48.840 に答える