当前位置: 首页 > 面试题库 >

JTextArea中的密码

百里泓
2023-03-14
问题内容

JTextArea用户键入时有什么方法可以用来隐藏文本?

有点像密码

JTextArea我有..

密码:

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

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

有没有解决方法,或者我该如何实现?

请帮忙


问题答案:

这就是我在评论中谈论的内容。请注意,这只是一个简单的示例(可能想安全地存储密码等),但是应该可以帮助您入门。

这段代码只是在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);
            }
        });
    }

}


 类似资料:
  • 问题内容: 有没有一种可靠的方法来计算字符串如何在JTextArea中划分为行? 我有一个固定宽度的JTextArea,当它被填充时,会添加一个新行并垂直扩展。 现在,我需要确切地知道哪一行中的字符。我可以使用字体指标来计算单个字符的宽度,但是我不知道这是否可靠,或者是否有更好的方法。 字体指标是“绝招”吗? 问题答案: 所有JTextComponent都具有和可以提供帮助的方法,但也许更好的是j

  • 有没有可靠的方法来计算一个字符串在JTextArea中是如何划分成行的? 我有一个固定宽度的JTextArea,当它被填充时,就会添加一个新行,并且它会垂直扩展。 现在,我需要确切地知道哪些字符在哪一行。我可以使用字体度量来增加单个字符的宽度,但我不知道这是否可靠,或者是否有更好的方法。 字体度量“诡计”是唯一的方法吗?

  • 问题内容: 我尝试在运行时中显示一些文本。但是,当我使用的循环来按顺序显示文本时,它仅显示最后一个循环的文本。这是我的代码: 我要显示它。但只显示一次“ ” 有人可以为我解释吗? 问题答案: 做到这一点,它将“字段的文本”设置为您提供的值,从而删除所有先前的内容。 你想要的是 如果您使用的是Java 8,则另一个选择可能是 (假设您想在每次调用该方法时替换文本,但仍然可以使用) 根据评论的假设进行

  • 介绍 (Introduction) JTextArea类是一个显示纯文本的多行区域。 Class 声明 (Class Declaration) 以下是javax.swing.JTextArea类的声明 - public class JTextArea extends JTextComponent 类构造函数 (Class Constructors) Sr.No. 构造函数和描述 1 JTe

  • 主要内容:1 Java JTextArea的介绍,2 Java JTextArea的声明,3 Java JTextArea的构造方法,4 Java JTextArea的方法,5 Java JTextArea的案例1,6 Java JTextArea的案例21 Java JTextArea的介绍 JTextArea类的对象是显示文本的多行区域。它允许编辑多行文本。它继承了JTextComponent类。 2 Java JTextArea的声明 我们来看一下javax.swing.JTextArea

  • 问题内容: 我在JTabbedPane中的(多个)JScrollPane中有一个JTextArea。 我需要访问JTextArea。如果没有JScrollPane,则可以执行以下操作: 在JScrollPane中如何获取? 干杯,瞪羚。 问题答案: 这条线看起来很复杂,但是我 认为 可以做到这一点。 但是我认为将您的存储在一个。 因此,您可以执行以下操作: 创建一个新的是这样的: 希望这可以帮助。