Swing创建密码口令框

Swing中支持密码框组件的是JPasswordField类,它是JTextField的子类,为密码输入提供特殊的文本字符。出于安全的原因,密码框不能显示出用户输入的字符,要显示与用户输入不同的字符,例如一个星号‘*’。作为另外一种安全措施,密码框将它的值存储为一个字符数组,而不是字符串。当用户结束输入密码并单击时,如按下回车键,密码框响应一个动作事件。例如:

JPasswordField passwordField = new JPasswordField (16);

其中构造器参数为一个整数,表明密码框的大小为16个字符列大小。默认情况下,密码框为输入的每一个字符显示一个圆点。如果想改变回显的字符,调用setEchoChar()方法。例如:

JPasswordField passwordField = new JPasswordField (16);

passwordField.setEchoChar(„@‟);

虽然JPasswordField类继承了getText()方法,但是还是应该使用getPassword()方法来获得用户输入的密码值。getText()方法不仅缺少安全性,而且在将来它可能会返回可见的字符串(例如,“******”)来代替用户输入的字符串。

为了更进一步增强安全性,一旦已经使用完了由getPassword()方法返回的字符数组,那么应该将该数组的元素全部清零。例如:

……

char[ ] input = passwordField.getPassword() ;                         //获得用户输入的密码的字符数组

……

Arrays.fill(input, „0‟) ;                                                                      //为了安全,使用填充方法将数组清零

passwordField.selectAll( ) ;

resetFocus( ) ;

……

如果要对两个密码进行验证,检测两个密码是否相同,使用以下的isPasswordCorrect()方法,将需要判断的密码字符数组作为参数。

例如:

private static boolean isPasswordCorrect(char[] input) {

        boolean isCorrect = true;                                          //声明布尔变量,起标志变量的作用

        char[] correctPassword = { 'b', 'u', 'g', 'a', 'b', 'o', 'o' };                        //字符数组,代表原始的密码

        if (input.length != correctPassword.length) {                                   //如果输入密码的长度与原始密码不同

              isCorrect = false; //标志变量为false

        } else {                                                                  //否则,如果两个密码长度相同

               isCorrect = Arrays.equals (input, correctPassword);                           //对两个密码数组进行判断

        }

        //清空密码.

        Arrays.fill(correctPassword,'0');                           // 出于安全考虑,用完以后要清除密码

        return isCorrect;                                                     //返回标志变量

}

例:创建并显示一个密码框的程序。

package chapter14;

import javax.swing.*;

public class PasswordDemo {

       JPasswordField passwordField;                      //声明密码框对象

       JFrame frame;                                          //声明窗体对象

       JPanel contentPane;                                   //声明面板对象

       JLabel label;                                            //声明标签对象

       public PasswordDemo () {                          //构造器,通常在构造器中创建swing组件对象

               frame = new JFrame("PasswordDemo ");                       //创建窗体对象

               frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                  //设置当关闭窗体时自动退出程序

              contentPane = new JPanel();                                       //创建面板对象

              frame.setContentPane(contentPane);                             //设置内容面板

              label = new JLabel(“请输入密码:”);                             //创建标签对象

              //创建文本框.

              passwordField = new JPasswordField ( 16);               //创建密码框对象

              passwordField.setEchoChar(„@‟);                                //设置密码框的回显字符为‟@‟

      }

      //创建GUI界面并显示.

      public void createAndShowGUI() {

              //添加组件.

             contentPane.add(label);                              //向内容面板中添加标签

             contentPane.add(passwordField);                 //向内容面板中添加密码框

             //显示窗口.

             frame.pack();                                    //设置组件以首选大小显示

             frame.setVisible(true);                             //显示窗体

     }

     public static void main(String[] args) {

            //为事件分发线程预订一个工作:创建并显示本程序的GUI.

           javax.swing.SwingUtilities.invokeLater(new Runnable() {

                    public void run() {

                            new PasswordDemo ().createAndShowGUI();

                    }

           });

     }

}


在上面的程序中,使用密码框对象的setEchoChar()方法设置密码框的回显字符为‘@’,同时在构造密码框是初始化其长度为16。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值