是否有一种简单的方法可以填充 JPasswordField
的文档,而无需创建包含密码的 String 对象?
我试图创建一个“更改密码”对话框,该对话框接受旧密码并要求输入新密码两次(三个密码字段),其中旧密码可能事先已知,具体取决于用户的方式配置此(密码可能已被存储)。因此,我不想每次向用户显示相关对话框时都要求用户输入现有密码,而是想以编程方式填写它。
请注意,JPasswordField.setText(String)
和 String
构造函数不是一个选项。我想使用 char
数组来执行此操作。
我一直在尝试滥用GapContent
,它似乎被PlainDocument
使用,但它似乎不起作用(字符在那里,但字段已损坏):
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JPasswordField;
import javax.swing.text.PlainDocument;
import javax.swing.SwingUtilities;
import javax.swing.text.GapContent;
public class FillJPasswordField extends JFrame {
private JPasswordField pass;
public FillJPasswordField() {
setLayout(new GridBagLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
char[] password = new char[]{'p', 'a', 's', 's', 'w', 'o', 'r', 'd'};
PlainDocument doc = new PlainDocument(new MyGapContent(password));
pass = new JPasswordField(doc, null, 20);
// see if the password is in there
System.out.println(new String(pass.getPassword()));
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0d;
gbc.insets = new Insets(10, 5, 10, 5);
add(pass, gbc);
pack();
setLocationRelativeTo(null);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new FillJPasswordField().setVisible(true);
}
});
}
private class MyGapContent extends GapContent {
public MyGapContent() {
super();
}
public MyGapContent(int initialLength) {
super(initialLength);
}
public MyGapContent(char[] content) {
this(content.length);
replace(0, 0, content, content.length);
}
}
}
最佳答案
嗯..以下似乎有效:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JPasswordField;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.GapContent;
import javax.swing.text.PlainDocument;
public class FillJPasswordField extends JFrame {
private JPasswordField pass;
public FillJPasswordField() {
setLayout(new GridBagLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
char[] password = new char[]{'p', 'a', 's', 's', 'w', 'o', 'r', 'd'};
MyGapContent content = new MyGapContent();
PlainDocument doc = new PlainDocument(content);
try {
content.insertChars(0, password);
} catch (BadLocationException ex) {
}
pass = new JPasswordField(20);
pass.setDocument(doc);
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.PAGE_START;
gbc.weightx = 1.0d;
gbc.insets = new Insets(10, 5, 10, 5);
add(pass, gbc);
System.out.println(new String(pass.getPassword()));
pack();
setLocationRelativeTo(null);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new FillJPasswordField().setVisible(true);
}
});
}
private class MyGapContent extends GapContent {
public MyGapContent() {
super();
}
public MyGapContent(int initialLength) {
super(initialLength);
}
public void insertChars(int where, char[] chars) throws BadLocationException {
if (where > length() || where < 0) {
throw new BadLocationException("Invalid insert", length());
}
replace(where, 0, chars, chars.length);
}
}
}
以前的代码似乎不喜欢我在 MyGapContent
的构造函数内调用 replace
的事实。也许它需要按某种顺序完成操作。
关于java - 以编程方式填充 JPasswordField 而不创建 String 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26975275/