JTextArea中的密码

时间:2014-04-11 12:17:23

标签: java swing jtextarea

有没有办法在用户输入时使用JTextArea来隐藏文本?

有点像密码..

JTextArea我有..

密码:

在最后一行,该行中的任何用户类型都不应该是可见的。

我尝试使用setForeground方法将字体颜色设置为textarea颜色,这会使文本不可见,但允许用户复制和粘贴。

是否有任何解决方法或我如何实现这一目标?

请帮忙

4 个答案:

答案 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教程中的部分,了解更多信息和工作示例。