Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当用户键入数字时,中间的四位数显示为通配符

当用户键入数字时,中间的四位数显示为通配符
EN

Stack Overflow用户
提问于 2013-06-30 00:14:37
回答 1查看 247关注 0票数 0

我正在开发一个使用JTextField让用户输入电话号码的Swing应用程序。为安全起见,当用户键入电话号码时,中间的四位数字需要显示为通配符。同时,当电话号码来自数据库时,此JTextField还将中间的四位数字显示为通配符。

如何自定义JTextField?任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2013-06-30 10:01:22

使用DocumentFilter

查看此示例,只需根据需要更改new PhoneNumberFilter(6,10,'*')即可。

F.I南非有10位数字的电话号码,前3位是拨号代码,其余的是唯一的号码。

因此,如果希望最后4位用*进行掩码,而整个电话号码是10位,我会执行new PhoneNumberFilter(6,10,'*')来标记最后4位(10-6=4)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;

public class Test {

    public Test() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

                //create instance of our custom DocumentFiler class
                PhoneNumberFilter phoneNumberFilter = new PhoneNumberFilter(6, 10, '*');


                JTextField jtf = new JTextField(10);
                //add filter to JTextField
                ((AbstractDocument) jtf.getDocument()).setDocumentFilter(phoneNumberFilter);
                frame.add(jtf);

                frame.pack();
                frame.setVisible(true);

                //jtf.setText("0119887654");
            }
        });
    }

    public static void main(String[] args) {
        new Test();
    }
}

class PhoneNumberFilter extends DocumentFilter {

    private int textLength = 0;//keeps track of length of text within the field (used to check if we should start applying the mask)
    private int numberMaskStartIndex;
    private int numberMaskEndIndex;
    private String mask;//what the characters in the specified ranges positions will be replaced with

    public PhoneNumberFilter(int start, int end, char mask) {
        numberMaskStartIndex = start;
        numberMaskEndIndex = end - 1;
        this.mask = String.valueOf(mask);
    }

    @Override
    public void replace(FilterBypass fb, int i, int i1, String string, AttributeSet as) throws BadLocationException {
        if (string.length() > 1) {
            for (int n = string.length() - 1; n >= 0; n--) {//an inserted string may be more than a single character i.e copy and pasting a number
                char c = string.charAt(n);//get a single character of the string
                if (n >= numberMaskStartIndex && n <= numberMaskEndIndex) {//check if its between the range which we should mask
                    super.replace(fb, i, i1, mask, as);
                } else {
                    super.replace(fb, i, i1, String.valueOf(c), as);
                }
                textLength++;
            }
        } else if (textLength >= numberMaskStartIndex && textLength <= numberMaskEndIndex) {//only a singe character was inserted and its between the range which we should mask
            super.replace(fb, i, i1, mask, as);
            textLength++;
        } else {
            super.replace(fb, i, i1, string, as);
            textLength++;
        }
    }

    @Override
    public void remove(FilterBypass fb, int i, int i1) throws BadLocationException {
        super.remove(fb, i, i1);
        if (i == 0 && i1 == textLength) {//if the text removed is the entire textfield i.e CTRL+A or Mouse dragged and DEL than we reset our counter which keeps track of the number of characters in the textfield
            textLength = 0;
        } else {//only a single character was deleted
            textLength--;
        }
    }

    @Override
    public void insertString(FilterBypass fb, int i, String string, AttributeSet as) throws BadLocationException {
        super.insertString(fb, i, string, as);
    }
}

我没有添加限制用户输入的功能,因此可以输入任何内容,上面更多的是为了显示以下所需的逻辑:

为安全起见,当用户输入电话号码时,中间的四位数需要显示为通配符。同时,当电话号码来自数据库时,此JTextField还会将中间的四位数显示为通配符

您可能仍然会问,从数据库获取时,它是否可以工作?是的,因为DocumentFilter也适用于setText(..);

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17385881

复制
相关文章
python如何保证输入键入数字
要求:用python写一个要求用户输入数字,如果不是数字就一直循环要求输入,直到输入数字为止的代码 错误打开方式: while True: ten=input('Enter a number:') if type(eval(ten))==type(int):    break 用这个输入字母可以可是输入字母就直接报错中断了 主要出在eval上。 第一个方案: while True: ten=input("x:") try: x=eval(ten)
marsggbo
2018/01/23
1.5K0
CCLabelAtlas的宽度为奇数时的显示bug
遇到一个很郁闷的bug,CCLabelAtlas设置文字内容在ipad上和android上正常,就只有iphone怎么显示都不正常。后来把它宽度 + 1,然后就正常了。发现以前宽度设置为21px、23px都有问题,+1px变为22px就正常了
meteoric
2018/11/19
5860
Mybatis 查询时对通配符的处理
Mybatis、MongoDB 或者 Solr 引擎在查询数据的时候,如果存在%_等通配符时,这些特殊符号都不会被作为字符串进行搜索,会导致查询不出数据或者查询出来的数据是不准确的,这个时候就需要对特殊字符进行转义。
chenchenchen
2021/09/06
6.4K0
mybatis当传入数据类型为Int时并且值为0时,会判断为空字符串
今天在mbatis中使用Xml配置sql语句时,出现了这样一个问题。当我传入的参数为0去做判断时,mybatis会把参数0当成是空字符串去判断而引起查询结果错误。
botkenni
2022/06/01
3.6K0
当网页图片不存在时不显示叉叉,显示默认图片的方法,管用的很!
有时候管理系统里面的产品图片没上传,或者因为网络原因传输过程中断了,图片没显示出来,就会显示一个叉叉,并且图片的占位符也不起作用了。昨晚上花了1个小时搜索、调试,验证了几种网络上的方法,最终有2种方法的确有效,鉴于代码优美的需要,我选择了如下一种。
崔文远TroyCui
2019/02/26
1.9K0
linux中添加用户时显示Current Kerberos password
linux 添加 用户,并为这个用户指定用户组,并将这个用户添加到 sudo 用户组 shell> useradd user 也可以用  shell> adduser user 用 adduser 比较好用一些,这样的话系统会自动将 standme 的目录什么都建立,然后直接提示你设置密码。 如果用 useradd ,之后还需要用 passwd user 来设置密码。 之前用 debian5的时候,直接添加用户,然后设置密码都没问题,这次全新安装 debian squeeze 6.0 之后,发现会
闵开慧
2018/03/30
2.8K0
Collectors.toMap 当value为空时,报空指针
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors;
botkenni
2022/11/12
3.1K0
Collectors.toMap 当value为空时,报空指针
星号替换手机号码的中间四位数
应用场景 在个人中心或者中奖人名单是用户的手机号码,为了保护用户隐私,需要将手机号码的中间四位数替换为星号! ---- 替换的用法 phoneNumber.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2'); ---- 应用实例 function withPhone(phoneArr){ let arr = []; phoneArr.forEach(o => arr.push(o.replace(/(\d{3})\d{4}(\d{4})/, '$1*
Rattenking
2021/02/01
9770
如何让文章显示用户评论时所用的设备是什么
怎样让文章的评论显示出用户评论时,使用的是什么设备呢? 获取用户IP 如果使用的是Typecho系统,那么评论里是可以直接获取到评论IP的。 $comments->ip 非Typecho系统,php语言则使用以下代码。 //获取IP function getIp(){ $ip= '-'; if ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]) { $ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FO
目的地-Destination
2023/03/06
2.1K0
如何让文章显示用户评论时所用的设备是什么
IL3002:当发布为单个文件时,避免调用
将应用发布为单个文件(例如将项目中的 PublishSingleFile 属性设置为 true)时,调用使用 RequiresAssemblyFilesAttribute 属性注释的成员与单文件不兼容。 这些调用可能不兼容,因为使用此属性注释的成员要求程序集文件位于磁盘上,而嵌入单文件应用的程序集已加载到内存中。
呆呆
2022/02/26
4580
WordPress评论时间显示为8小时前的解决方法
大早上的心动科技的博主就来搞事情了,评论大早上跑来逛你们网站挖掘学习好东西!然后就在 Boke112 导航的交流群里艾特我,8 小时 BUG!!! 我跑来一看还真的是这样,快了 8 个小时,什么鬼啊?谁搞我服务器了?昨天还是正常的啊,心动大佬你是不是搞我服务器了!!WordPress 的默认时区是 UTC 格林威治时间,我看我后台常规设置中选的就是上海时区,但是就算是将 WordPress 时区调整为上海或 UTC+8 后,前台评论时间显示均还是 UTC 时间,与北京时间仍有 8 小时的时差,而后台评论的时
沈唁
2018/05/24
2.7K0
当elementUi 中select选中值绑定为对象时,操作selected时默认高亮的value如何正常显示
注意事项: 1.如上代码value绑定的是item的对象; 2.首先在el-option中添加:key="item.id"的属性; 3.然后在el-select 添加value-key="id"属性,注意value-key前面没有: 4.注意value-key的值与key绑定的属性值对应。
李维亮
2021/07/08
2.4K0
0769-7.0.3-如何在Kerberos环境下用Ranger完成对Hive的行过滤及列脱敏
本篇文章主要介绍如何在CDP DC7.0.3集群中使用Ranger在Hive中进行行过滤及列脱敏,行级别的过滤相当于一个强制性的where子句,例如在订单表中,员工仅被允许查看自己所在地区的订单,其他区域的无法查看。列脱敏可以对某些敏感信息的列进行数据屏蔽,例如身份证号可以屏蔽中间的八位。
Fayson
2020/05/24
1.8K0
当AI泡沫破裂时……
很显然我们目前处于一个不稳定的状态。这到底是一场泡沫还是一次革命?答案是当然包含一点革命——深度神经架构所创造的实实在在的成功已经颠覆了视觉和语音识别领域,更通用的机器学习也已经有了大量真实世界用例。
刀刀老高
2018/07/24
3600
当AI泡沫破裂时……
很显然我们目前处于一个不稳定的状态。这到底是一场泡沫还是一次革命?答案是当然包含一点革命——深度神经架构所创造的实实在在的成功已经颠覆了视觉和语音识别领域,更通用的机器学习也已经有了大量真实世界用例。
机器之心
2018/07/26
3760
Git_错误_03_ Git提交时显示用户 unknown
这是因为没有设置用户名 $ git config --global user.name "your_name" $ git config --global user.email "your_email@youremail.com"
shirayner
2018/08/10
7740
长按键入
你的朋友正在使用键盘输入他的名字name。偶尔,在键入字符c时,按键可能会被长按,而字符可能被输入1次或多次。
WindRunnerMax
2020/10/26
9360
什么是路由模式通配符?
路由模式是 CUCM 用来确定将呼叫路由到何处的一串数字,例如,一个简单的路由模式可以是一个像 812-555-4001 这样的数字,路由模式具有与该路由模式关联的路由列表。然而,正如我们稍后将看到的,这并没有考虑到外部路由号码,通常是 9。
网络技术联盟站
2023/03/13
5070
什么是路由模式通配符?
点击加载更多

相似问题

当有人键入数字0时停止循环

14

在iOS应用程序中将用户键入的数字显示为上标

20

用户键入数字时的Javascript计算器

20

当find在路径中间使用通配符时删除目录

210

当被通配符包围时,如何使中间捕获组工作?

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文