有没有办法在用户输入时使用JTextArea
来隐藏文本?
有点像密码..
在JTextArea
我有..
密码:
在最后一行,该行中的任何用户类型都不应该是可见的。
我尝试使用setForeground
方法将字体颜色设置为textarea颜色,这会使文本不可见,但允许用户复制和粘贴。
是否有任何解决方法或我如何实现这一目标?
请帮忙
答案 0 :(得分:3)
使用JPasswordField类(JTextField的子类)为密码输入提供专门的文本字段。
以下是供参考的链接: http://docs.oracle.com/javase/tutorial/uiswing/components/passwordfield.html
答案 1 :(得分:2)
只需使用JPasswordField
JTextField
的子类。
它在java doc中非常清楚简单地讨论过,所以我避免重复。
答案 2 :(得分:2)
这是我在评论中谈论的内容。请注意,这只是一个简单的示例(可能需要安全地存储密码等),但应该让您入门。
此代码只是在DocumentFilter
上添加了JTextArea
,并且绝不允许将密码字符放入其中Document
。相反,他们会在其他地方重新路由。这与预期敏感输入的控制台类似。
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.PlainDocument;
public class CapturePassword extends JFrame {
private JScrollPane scroll;
private JTextArea textArea;
private JToggleButton expectPassword;
private StringBuilder password; // you would of course use something else
public CapturePassword() {
setLayout(new BorderLayout());
password = new StringBuilder();
textArea = new JTextArea();
scroll = new JScrollPane(textArea);
add(scroll);
expectPassword = new JToggleButton("Capture password");
add(expectPassword, BorderLayout.PAGE_END);
expectPassword.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (expectPassword.isSelected()) {
capture(true);
} else {
capture(false);
JOptionPane.showConfirmDialog(
CapturePassword.this,
"Captured password: " + password.toString(),
"Password!", JOptionPane.DEFAULT_OPTION,
JOptionPane.INFORMATION_MESSAGE);
password.setLength(0); // reset
}
textArea.requestFocusInWindow();
}
});
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(200, 400);
setLocationRelativeTo(null);
}
private void capture(boolean start) {
PlainDocument document = (PlainDocument)textArea.getDocument();
DocumentFilter filter = new DocumentFilter() {
private void doAppend(String text) {
if (text.endsWith("\n")) {
expectPassword.doClick();
} else {
password.append(text);
}
}
@Override
public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {
// you would have to handle multi-line pastes here also
doAppend(text);
}
@Override
public void remove(DocumentFilter.FilterBypass fb, int offset, int length) throws BadLocationException {
// cannot remove while filtering
}
@Override
public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
doAppend(text);
}
};
document.setDocumentFilter(start ? filter : null);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new CapturePassword().setVisible(true);
}
});
}
}
答案 3 :(得分:0)
我尝试使用setForeground方法将字体颜色设置为textarea颜色,这使文本不可见,但允许用户复制和粘贴。
如果要为文本的不同部分播放不同的属性,则需要使用JTextPane。
阅读Text Component Features上Swing教程中的部分,了解更多信息和工作示例。