- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个 Swing 应用程序,它使用 JTextField 让用户输入电话号码。为了安全起见,当用户输入电话号码时,中间的四位数字需要显示为通配符。同时,当电话号码来自数据库时,此 JTextField 还会显示中间的四位数字作为通配符。
如何自定义JTextField?非常感谢任何帮助。
最佳答案
使用DocumentFilter
。
查看此示例,只需根据您的具体需求更改 new PhoneNumberFilter(6,10,'*')
即可。
F.I South Africa 的电话号码长度为 10 位数字,前 3 位是拨号代码,其余是唯一号码。
因此,如果希望用 *** 屏蔽最后 4 位数字,并且整个电话号码为 10 位数字,我会使用 new PhoneNumberFilter(6,10,'*')
来标记最后一个4(10-6=4)。
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);
}
}
我没有添加限制用户输入的功能,因此可以输入任何内容,上面更多的是展示所需的逻辑:
For security, the four digit in the middle need to be displayed as wildcard while user type the phone number. Meanwhile, this JTextField also show the four digit in the middle as wildcard when the phone number is from database
您可能仍然会问从数据库获取时它是否有效,是的,因为 DocumentFilter 也适用于 setText(..);
关于java - 当用户键入数字时,中间的四位数字显示为通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17385881/
考虑代码: def foo() -> ??: return bar() 我怎么能说我希望 foo 的返回类型与 bar() 的返回类型相同? 在 C++ 中,我可以使用 decltype,类
我运行以下 mysql 查询并看到第一个查询的类型为 ALL。 mysql> EXPLAIN SELECT one.language_id as filter_id,
http://muaddibspace.blogspot.com/2008/01/type-inference-for-simply-typed-lambda.html是 Prolog 中简单类型 l
鉴于类型 type EnumerableComponentFactory = (config: { Container: React.ComponentType; Item: React.Co
我在我的自动 rmarkdown pdf 文档中使用 stargazer 包来制作漂亮的表格。默认情况下,Stargazer 将其表格放置在页面的中心。如何让观星者生成将表格与左侧对齐的 latex
class A: pass class B(A): pass ListOfA = List[A] list_of_a : ListOfA = [A(), A()] for e in [
我目前正在研究学习 WPF 和 Silverlight。到目前为止,我一直在用 Delphi 和 C# (Winforms) 进行开发。在看一些关于 WPF 的书籍和在线观看一些介绍性视频时,我的印象
在输入如下内容后: ) 按钮。但是那个按钮比较不方便。 (请注意,对于 Orientation="Horizontal" 等下拉选项不存在此问题,从下拉菜单中选择 Horizontal 后,插
我在输入以下内容时遇到问题。 问题在于 TeamIcon . 我的对象定义如下。 import TeamIcon from './components/icons/TeamIcon'; export
Demo 我这里有一个验证类是否存在于 div 中的演示。当没有类时,另一个类将从按钮中删除。基本上,当没有禁用按钮时,添加按钮上的禁用将被删除。 如果用户做的最后一件事是更改,这可以正常工作,但如果
这个问题在这里已经有了答案: How can I access object properties containing special characters? (2 个答案) 关闭 9 年前。 我
尝试创建一个 Web 应用程序(使用 mySQL 和 Python),其中包含马萨诸塞州的徒步旅行路线列表。我只想在一页上显示我的数据库中所有路径的名称,但不知道为什么什么都不显示: ########
您好,我想在使用 jQuery 的文本输入字段中键入时用点替换逗号。我现在有这段代码; $(document).on('change', '.unitprice', function() { $(
我为静态主页编写了以下代码。在这里我想使用类型化的库,它包含在部分“head.html”中。但是由于键入我的内容不断跳跃。这是因为在某个时刻字幕容器是空的。我试过添加默认占位符,但这似乎无法解决问题。
我想知道有没有类似于scanf的函数允许在c中自定义输入。我想要做的是当用户输入想要的日期时,每隔几个字符添加一个点。当用户想要确认他的输入时,他应该按下回车键,并且该变量被保存在某处。 示例:用户输
Java 中有没有办法让 ListModel 只接受特定类型?我要找的是类似 DefaultListModel 的东西或 TypedListModel ,因为 DefaultListModel 只实现
考虑如下数组类型: let example1: MyArray = ['John'], example2: MyArray = [4, 5, 1, 5, 'Eric'], exampl
我想弄清楚我是否正确输入了我的 React 高阶组件。在大多数情况下,这是正常工作的,但是在将 React 引用应用于 HOC 实例时,我遇到了输入问题。下面是一个简化的重现: import * as
这是 Python 3.7 我有一个这样的数据类: @dataclass class Action: action: str 但 Action 实际上仅限于值“bla”和“foo”。有没有一种明
我想弄清楚我是否正确输入了我的 React 高阶组件。在大多数情况下,这是正常工作的,但是在将 React 引用应用于 HOC 实例时,我遇到了输入问题。下面是一个简化的重现: import * as
我是一名优秀的程序员,十分优秀!