如何通过跳过换行符将文本区域内容替换为“*”

Posted

技术标签:

【中文标题】如何通过跳过换行符将文本区域内容替换为“*”【英文标题】:How can text area contents can be replaced to "*" by skipping the new line character 【发布时间】:2020-03-24 18:02:19 【问题描述】:

我有一个要求,我需要在运行时将所有文本替换为“”(基本上是屏蔽)进入 jtextArea。意思是说我将密钥存储到 textArea 的一个变量中,显示为“”。 得到了一个代码:

public class App 
            String text= "";
            App()
                JFrame f= new JFrame();
               // final JTextArea area=new JTextArea();
                JTextArea jTextArea=new JTextArea();

                jTextArea.addKeyListener(new KeyListener() 
                public void keyTyped(KeyEvent e) 

                

                public void keyPressed(KeyEvent e) 

                

                public void keyReleased(KeyEvent e) 
                   if(Character.isLetter(e.getKeyChar())) 
                  System.out.println(text);
                     //text = text + e.getKeyChar();
                       text += String.valueOf(e.getKeyChar());
                       System.out.println(text);
                       jTextArea.setText(text.replaceAll("[a-z]", "*"));
                   
                   //System.out.println(text);
               

            );
                System.out.println(text);
            jTextArea.setBounds(10,30, 200,200);
            jTextArea.setAutoscrolls(true);
            f.add(jTextArea);
            f.setSize(300,300);
            f.setLayout(null);
            f.setVisible(true);
        
        public static void main(String args[])
        
            new App();
        


这里的问题是它也转换了我的“新行”并将其添加到第一行本身。

我的要求是:

输入:

Hello

how
are

you

应该显示为:

*****

***
***

***

请多多指教

【问题讨论】:

看起来期望没有正确显示,但最终每个字符都必须替换为“*”,并且新行将按原样出现 【参考方案1】:

如果这是您要查找的内容,请检查以下代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class App 
            String text= "";
            App()
                JFrame f= new JFrame();
               // final JTextArea area=new JTextArea();
                JTextArea jTextArea=new JTextArea();

                jTextArea.addKeyListener(new KeyListener() 
                public void keyTyped(KeyEvent e) 

                

                public void keyPressed(KeyEvent e) 

                

                public void keyReleased(KeyEvent e) 
                       text += String.valueOf(e.getKeyChar());
                       System.out.println(text);
                       jTextArea.setText(text.replaceAll("[a-z]", "*"));
               

            );
                System.out.println(text);
            jTextArea.setBounds(10,30, 200,200);
            jTextArea.setAutoscrolls(true);
            f.add(jTextArea);
            f.setSize(300,300);
            f.setLayout(null);
            f.setVisible(true);
        
        public static void main(String args[])
        
            new App();
        


【讨论】:

【参考方案2】:

您的错误是您没有将换行符附加到text 变量,这意味着text 将始终有字母,但不会有新行。由于您将文本字段的文本设置为 texttext 也应该包含这些换行符。

您应该删除 if 语句,因为在 replaceAll 调用中的正则表达式 [a-z] 已经“完成”了检查。

public void keyReleased(KeyEvent e) 
    text += String.valueOf(e.getKeyChar());
    jTextArea.setText(text.replaceAll("[a-z]", "*"));

但是,这仍然不能处理退格和粘贴之类的东西,更不用说如果 textStringBuilder 会更好。但我会留给你来改进你的代码。

【讨论】:

谢谢!确实,它不需要任何 if 验证。我在那里做错了。【参考方案3】:

由于其他两个答案都存在仅替换字母输入的问题,因此忽略了所有数字、特殊字符或空格,我想我也会添加。如果您实际上只是想将 ANY 字符替换为星号,您甚至不必使用 RegEx 和替换字符,您不妨在每次调用 keyReleased 事件时附加一个星号。

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class App

    String displayText = "";
    String valueText = "";

    App()
    
        JFrame f = new JFrame();
        // final JTextArea area=new JTextArea();
        JTextArea jTextArea = new JTextArea();

        jTextArea.addKeyListener(new KeyListener()
        
            public void keyTyped(KeyEvent e)
            
            

            public void keyPressed(KeyEvent e)
            

            

            public void keyReleased(KeyEvent e)
            
                if(e.getKeyCode() != KeyEvent.VK_ENTER)
                
                    displayText += "*";
                    valueText += String.valueOf(e.getKeyChar());
                    jTextArea.setText(displayText);
                
            

        );
        System.out.println(valueText);
        jTextArea.setBounds(10, 30, 200, 200);
        jTextArea.setAutoscrolls(true);
        f.add(jTextArea);
        f.setSize(300, 300);
        f.setLayout(null);
        f.setVisible(true);
    

    public static void main(String args[])
    
        new App();
    



如果您想将输入的值保留在后端,只需将输入的值保存在某处并仅显示text

【讨论】:

它不会考虑“输入”并且文本将继续附加到新行。看起来会丢失输入的输入,但需要像输入必须被屏蔽,并且值必须保持原样,以便可以在其他地方使用相同的内容。 1.) 我的错,没有考虑输入大小写。 2.) 我确实告诉过您如何通过将其保存在不会显示给用户的不同变量中来保留该值。不过是感恩节,所以我编辑了我的代码以包含这两个条件。 不走运!它仍然将文本附加到第一行本身并忽略新行。这将解决问题: public void keyReleased(KeyEvent e) text += String.valueOf(e.getKeyChar()); jTextArea.setText(text.replaceAll(".", "*"));但我看到的一个挑战是它也考虑“退格”,这是不对的。我在想什么正则表达式将有助于解决这个问题【参考方案4】:

这是按预期工作的完整代码:

import javax.swing.*;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;

    public class App 
            //String text= "";
        String text = "";
            App()
                JFrame f= new JFrame();
               // final JTextArea area=new JTextArea();
                JTextArea jTextArea=new JTextArea();

                jTextArea.addKeyListener(new KeyListener() 
                public void keyTyped(KeyEvent e) 

                

                public void keyPressed(KeyEvent e) 

                

                public void keyReleased(KeyEvent e) 
                    char ch = e.getKeyChar();
                    if (e.getExtendedKeyCode() == KeyEvent.VK_BACK_SPACE) 
                        //System.out.println("It Works Backspace pressed..!");
                    
                    else 
                    text += String.valueOf(ch);
                    
                    //System.out.println(e.getKeyChar());
                    jTextArea.setText(text.replaceAll(".", "*"));
                    //jTextArea.setText(text.replaceAll(".[\b]", "*"));
                    //jTextArea.setText(text.toString().replaceAll("[\\b].", "*"));
                

            );
                System.out.println(text);
            jTextArea.setBounds(10,30, 200,200);
            jTextArea.setAutoscrolls(true);
            f.add(jTextArea);
            f.setSize(300,300);
            f.setLayout(null);
            f.setVisible(true);
        
        public static void main(String args[])
        
            new App();
        


【讨论】:

以上是关于如何通过跳过换行符将文本区域内容替换为“*”的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止 Chrome 在我的文本区域中添加额外的换行符?

Javascript换行文本区域

如何在表格中显示文本区域的换行符?

如何在预填充的文本区域中将 <br /> 转换为换行符

将文本区域中的 <br /> 替换为行分隔符(Javascript)

在文本区域中捕获换行符(换行符、换行符)字符