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。