Java 教程已针对 JDK 8 编写。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java 语言更改以获取 Java SE 9 及后续版本中更新的语言特性的摘要。
请参阅JDK 发行说明以获取有关所有 JDK 发行版的新功能、增强功能和已删除或不推荐使用选项的信息。
JPasswordField 类是 JTextField 的子类,提供了用于输入密码的特殊文本字段。出于安全原因,密码字段不显示用户输入的字符。相反,该字段显示与所键入的字符不同的字符,例如星号“*”。作为另一种安全预防措施,密码字段将其值存储为字符数组,而不是字符串。与普通的文本字段一样,当用户表示文本输入已完成时(例如按下回车按钮),密码字段会触发一个动作事件。
下面是一个打开一个小窗口并提示用户输入密码的演示的图片。
点击“运行”按钮以使用 Java™ Web Start 运行 PasswordDemo(下载 JDK 7 或更高版本)。或者,要自行编译和运行示例,请参考示例索引。
密码是“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;
}
下表列出了常用的 JPasswordField 构造函数和方法。有关密码字段继承的 API,请参见如何使用文本字段。
| 构造函数或方法 | 用途 |
|---|---|
| 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,请参见密码字段。