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,请参见密码字段。