Java 在JTextField中屏蔽一些字符

Java 在JTextField中屏蔽一些字符,java,swing,jtextfield,jformattedtextfield,Java,Swing,Jtextfield,Jformattedtextfield,我需要在用户输入时屏蔽数字,所以在用户界面上,用户应该看到一个屏蔽数字,但在Java代码上,我应该得到完整的数字,包括屏蔽字符 什么用户应该看到4545*******9632 但是在Java代码(behind)中,我应该得到完整的数字,包括掩码字符。我用JFormattedTextField尝试了MaskFormatter,但不起作用,它显示了整个数字 try { MaskFormatter mask=new MaskFormatter("####********####");

我需要在用户输入时屏蔽数字,所以在用户界面上,用户应该看到一个屏蔽数字,但在Java代码上,我应该得到完整的数字,包括屏蔽字符 什么用户应该看到4545*******9632 但是在Java代码(behind)中,我应该得到完整的数字,包括掩码字符。我用
JFormattedTextField
尝试了
MaskFormatter
,但不起作用,它显示了整个数字

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);
  }
您可以使用正则表达式:

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>

初始值=4;
设maskChars=6;
让realNumber=“”;
$(函数(){
$('#myinput').keyup(函数(e){
realNumber+=this.value[this.value.length-1];
如果(this.value.length>=initial&&this.value.length这是我的任务

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();
}
类ACustomJEditText扩展JTextField{
ArrayList realText=新建ArrayList();
字符串displayText=“”;
公众敏感度编辑文本(){
//TODO自动生成的构造函数存根
超级();
addKeyListener(新的KeyAdapter(){
@凌驾
公共无效密钥已释放(密钥事件e){
//删除退格中的文本
if(e.getKeyCode()==KeyEvent.VK_BACK_SPACE){
if(realText!=null&&realText.isEmpty()=false){
realText.remove(realText.size()-1);//删除字符
}
turnRealTextToString();
//在此处设置显示文本
setText(显示文本);
返回;
}
//如果字符串实际大小大于16,请避免任何输入
如果(realText.size()==16){
setText(显示文本);
返回;
}
//其他键现在应该只添加到数字输入中
试一试{
int input=Integer.parseInt(如getKeyChar()+);
//将int添加到realtext
realText.add(输入+“”);
//将实文本转换为字符串
turnRealTextToString();
setText(显示文本);
}捕获(例外情况除外){
//其他键失效。
setText(显示文本);
}
}
私有void turnRealTextToString(){
字符串结果=”;
对于(int i=0;i3&&i){
real.append(文本);
});
返回real.toString();
}
}


应该像魔术一样工作。

问题是java不是javascriptMy bad。我没有注意到。编辑我的答案。您共享的java代码只有在用户已键入完整数字时才起作用,但我的问题是只显示前4位和后4位数字,并将8位数字隐藏在16位字符串之间。我不是java专家,但我认为您不能直接从服务器端代码响应用户。因为服务器端代码基于请求工作。要即时修改UI,您可能必须使用JS。这是我的观点。这是swing,与客户端服务器无关
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();
}