【问题标题】:Mask Some Char in a JTextField屏蔽 JTextField 中的一些字符
【发布时间】:2019-08-22 08:54:04
【问题描述】:

当用户在用户 UI 上键入时,我需要屏蔽数字,用户应该看到一个被屏蔽的数字,但在 Java 代码上我应该得到整个数字,包括被屏蔽的字符,即 用户应该看到什么 4545********9632 但是在 Java 代码(后面)上,我应该得到包括掩码字符在内的整个数字。我试过 MaskFormatterJFormattedTextField 并不起作用,它显示整个数字。

try {
     MaskFormatter mask=new MaskFormatter("####********####");
      JFormattedTextField js=new JFormattedTextField();
     mask.install(js);
  } catch (ParseException ex) {
      Logger.getLogger(Masker.class.getName()).log(Level.SEVERE, null, ex);
  }

【问题讨论】:

    标签: java swing jtextfield jformattedtextfield


    【解决方案1】:

    这是我的建议,

    class ACustomJEditText extends JTextField{
    ArrayList<String> realText=new ArrayList<String>();
    String displayText="";
    
    public ACustomJEditText() {
        // TODO Auto-generated constructor stub
        super();
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
    
                // DELETE TEXT on backspace
                if(e.getKeyCode()==KeyEvent.VK_BACK_SPACE) {
                    if(realText!=null && realText.isEmpty()==false) {
                        realText.remove(realText.size()-1);//remove character
                    }
                    turnRealTextToString();
                    //set the display text here
                    setText(displayText);
                    return;
                }
    
                //avoid any input if string actually string size is greater than 16
                if(realText.size()==16) {
                    setText(displayText);
                    return;
                }
    
                //other keys should now be added to the input for only numbers
                try{
                    int input=Integer.parseInt(e.getKeyChar()+"");
                    //add int to realtext
                    realText.add(input+"");
                    //turn real text to ####********#### string
                    turnRealTextToString();
                    setText(displayText);
                }catch (Exception ex) {
                    // Other keys fail.
                    setText(displayText);
                }
            }
    
            private void turnRealTextToString() {
                String result="";
                for(int i=0;i<realText.size();i++) {
                    if(i>3 && i<12) {
                        result+="*";
                    }else {
                        result+=realText.get(i);
                    }
    
                }
                String realDisplay=realText.toString();
                System.out.println("DISPLAY: "+result+" REAL: "+getRealText());
    
                //set result to display text
                displayText=result;
                setText(displayText);
            }
        });
    }
    
    //get the actual real text
    public String getRealText() {
        StringBuilder real=new StringBuilder();
        realText.forEach(text->{
            real.append(text);
        });
    
        return real.toString();
    }
    

    }

    应该像魔术一样工作。

    【讨论】:

      【解决方案2】:

      你可以使用正则表达式:

      var cardnumber = '4567 6365 7987 3783';
      var first4 = cardnumber.substring(0, 4);
      var last5 = cardnumber.substring(cardnumber.length - 5);
      
      mask = cardnumber.substring(4, cardnumber.length - 5).replace(/\d/g,"*");
      console.log(first4 + mask + last5);
      

      或者如果你可以尝试这样的事情:

      <html>
      <head>
      <script
        src="https://code.jquery.com/jquery-3.3.1.min.js"
        integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
        crossorigin="anonymous"></script>
      </head>
      <body>
      <input class="form-control" id="myinput" data-length="12" name="name">
      </body>
      </html>
      <script>
      let initial = 4;
      let maskChars = 6;
      let realNumber = "";
      $(function() {
        $('#myinput').keyup(function(e) {
      realNumber += this.value[this.value.length-1];
          if (this.value.length >= initial && this.value.length <= initial + maskChars) {
            this.value = this.value.slice(0, -1) + '*';
          }
        });
      });
      </script>
      

      这就是我在 JS 上的工作方式。这个想法是一样的。如果长度大于您想要的数字长度,您可以用 * 替换字符。我还没有尝试过这个 Java 代码。有关更多信息,您可以访问此链接: https://www.javacodeexamples.com/mask-part-of-string-example-java/878

      package com.javacodeexamples.stringexamples;
      
      import org.apache.commons.lang3.StringUtils;
      
      public class MaskStringExample {
      
          public static void main(String[] args) throws Exception {
      
              String str = "1234567812345678";
      
              //mask first 4 characters
              System.out.println( maskString(str, 0, 4, '*') );
      
              //mask everything but last 4 digits
              System.out.println( maskString(str, 0, 12, '*') );
      
              //mask everything
              System.out.println( maskString(str, 0, str.length(), '*') );
      
              //mask everything but first and last 4 digits
              System.out.println( maskString(str, 1, 12, '*') );
      
          }
      
          private static String maskString(String strText, int start, int end, char maskChar)
              throws Exception{
      
              if(strText == null || strText.equals(""))
                  return "";
      
              if(start < 0)
                  start = 0;
      
              if( end > strText.length() )
                  end = strText.length();
      
              if(start > end)
                  throw new Exception("End index cannot be greater than start index");
      
              int maskLength = end - start;
      
              if(maskLength == 0)
                  return strText;
      
              String strMaskString = StringUtils.repeat(maskChar, maskLength);
      
              return StringUtils.overlay(strText, strMaskString, start, end);
          }
      
      }
      

      【讨论】:

      • 问题是java而不是javascript
      • 我的错。我没有注意到。编辑我的答案。
      • 只有当用户已经输入了完整的数字时,您共享的 java 代码才有效,但我的问题是只显示前 4 位和后 4 位数字,并屏蔽 16 位字符串之间的 8 个数字
      • 我不是 JAVA 专家,但我认为您不能直接从服务器端代码响应用户。因为服务器端代码基于请求工作。对于 UI 的即时修改,您可能必须使用 JS。这是我的看法。
      • 这是swing,与客户端服务器无关
      猜你喜欢
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      相关资源
      最近更新 更多