文档

Java™ 教程
隐藏目录
如何使用密码字段
教程:创建使用 Swing 的 GUI
课程:使用 Swing 组件
章节:如何使用各种组件

如何使用密码字段

JPasswordField 类是 JTextField 的子类,提供了用于输入密码的特殊文本字段。出于安全原因,密码字段不显示用户输入的字符。相反,该字段显示与所键入的字符不同的字符,例如星号“*”。作为另一种安全预防措施,密码字段将其值存储为字符数组,而不是字符串。与普通的文本字段一样,当用户表示文本输入已完成时(例如按下回车按钮),密码字段会触发一个动作事件

下面是一个打开一个小窗口并提示用户输入密码的演示的图片。

PasswordDemo 的快照,使用密码字段

点击“运行”按钮以使用 Java™ Web Start 运行 PasswordDemo(下载 JDK 7 或更高版本)。或者,要自行编译和运行示例,请参考示例索引

启动 PasswordDemo 应用程序

密码是“bugaboo”。密码“bugaboo”只是一个示例。在生产系统中,请使用安全的身份验证方法。您可以在PasswordDemo.java中找到此程序的完整代码。以下是创建和设置密码字段的代码:

passwordField = new JPasswordField(10);
passwordField.setActionCommand(OK);
passwordField.addActionListener(this);

传递给 JPasswordField 构造函数的参数指示字段的首选大小,在本例中至少为 10 列。默认情况下,密码字段为每个键入的字符显示一个点。如果要更改回显字符,请调用 setEchoChar 方法。然后,代码向密码字段添加一个动作监听器,该监听器检查用户输入的值。以下是动作监听器的 actionPerformed 方法的实现:

public void actionPerformed(ActionEvent e) {
    String cmd = e.getActionCommand();

    if (OK.equals(cmd)) { //处理密码。
        char[] input = passwordField.getPassword();
        if (isPasswordCorrect(input)) {
            JOptionPane.showMessageDialog(controllingFrame,
                "成功!您输入了正确的密码。");
        } else {
            JOptionPane.showMessageDialog(controllingFrame,
                "密码无效。请重试。",
                "错误消息",
                JOptionPane.ERROR_MESSAGE);
        }

        //清除可能的密码,以增强安全性。
        Arrays.fill(input, '0');

        passwordField.selectAll();
        resetFocus();
    } else ...//处理“帮助”按钮...
}

安全注意事项: 为了进一步增强安全性,当您使用 getPassword 方法返回的字符数组完成后,应将其每个元素设置为零。上面的代码片段显示了如何执行此操作。

在执行需要密码的任何操作之前,使用密码字段的程序通常会验证密码。此程序调用一个私有方法 isPasswordCorrect,将 getPassword 方法返回的值与存储在字符数组中的值进行比较。以下是它的代码:

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;
    } else {
        isCorrect = Arrays.equals (input, correctPassword);
    }

    //清除密码。
    Arrays.fill(correctPassword,'0');

    return isCorrect;
}

密码字段 API

下表列出了常用的 JPasswordField 构造函数和方法。有关密码字段继承的 API,请参见如何使用文本字段

常用的 JPasswordField 构造函数和方法
构造函数或方法 用途
JPasswordField()
JPasswordField(String)
JPasswordField(String, int)
JPasswordField(int)
JPasswordField(Document, String, int)
创建密码字段。当存在时,int 参数指定字段的所需宽度(以列为单位)。String 参数包含字段的初始文本。Document 参数为字段提供了自定义模型。
char[] getPassword() 将密码作为字符数组返回。
void setEchoChar(char)
char getEchoChar()
设置或获取替代实际由用户键入的字符显示的回显字符。
void addActionListener(ActionListener)
void removeActionListener(ActionListener)
(在 JTextField 中定义)
添加或删除动作监听器。
void selectAll()
(在 JTextComponent 中定义)
选择密码字段中的所有字符。

使用密码字段的示例

PasswordDemo 是教程中仅使用 JPasswordField 对象的示例。然而,教程中有许多示例使用 JTextField 对象,JPasswordField 继承了它的 API。有关更多信息,请参见使用文本字段的示例

如果您正在使用 JavaFX,请参见密码字段


上一页:如何使用面板
下一页:如何使用进度条