Замаскировать символ в JTextField - PullRequest
2 голосов
/ 01 апреля 2019

Мне нужно маскировать число, когда пользователь печатает, поэтому в пользовательском интерфейсе пользователя пользователь должен видеть замаскированное число, но в коде Java я должен получить полное число, включая замаскированный символ, который что пользователь должен видеть 4545 ******** 9632 но в коде Java (сзади) я должен получить полное число, включая замаскированный символ. Я пробовал MaskFormatter с JFormattedTextField и не работает, отображается полное число.

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);
  }

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Вот мое предположение,

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();
}

}

Должно работать как по волшебству.

0 голосов
/ 01 апреля 2019

Вы можете использовать регулярное выражение:

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);
    }

}
...