我看遍了整个网络,所有我尝试过的东西都没用。。。。
我发现我可以使用一些JTextFormatterField,但它不起作用。
然后我发现我可以将DocumentFilter与正则表达式一起使用,我所做的是:
JTextField jFormattedTextFieldMoneyToConvert = new JTextField();
((AbstractDocument) jFormattedTextFieldMoneyToConvert.getDocument()).setDocumentFilter(new DocumentFilter(){
Pattern regEx = Pattern.compile("^\\d+\\.?\\d*$");
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
Matcher matcher = regEx.matcher(text);
if (!matcher.matches()) {
return;
}
super.replace(fb, offset, length, text, attrs);
}
});
但它不起作用。。。它只接受数字。我希望它也能接受点。我还需要它不要以点开头,也不要以点结尾。
我做错了什么?
不久前我遇到了类似的问题。问题不在于正则表达式,而是我对过滤器工作原理的误解。我的假设,和你一样,传递给替换
方法的String text
是整个字符串,而实际上它只是正在键入的字符。这里有类似的讨论。
虽然@Bohemian的所有正则表达式功夫可能都是你想要的匹配正则表达式(我不知道,这不是我的强项),但问题(假设)可以通过获取整个文档文本来解决,然后尝试匹配,即。
String completeText = fb.getDocument().getText(0, fb.getDocument().getLength());
“我还需要它不要以点开头,也不要以点结尾”
逻辑地思考一下。为每个字符输入调用过滤器。但你不想以结尾
但您希望允许
中间的某个地方。不允许
结尾否定出现
的可能性
在下一个数字之前的末尾
您可能只需要编写一个焦点侦听器来添加0或删除
当字段失去焦点时,如果用户留下挂起的
更新:完整示例
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
public class FilterDemo {
public FilterDemo() {
JFrame frame = new JFrame();
frame.setLayout(new GridBagLayout());
frame.setSize(300, 300);
frame.add(createFilteredField());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JTextField createFilteredField() {
JTextField field = new JTextField(20);
AbstractDocument document = (AbstractDocument) field.getDocument();
final int maxCharacters = 10;
document.setDocumentFilter(new DocumentFilter() {
@Override
public void replace(FilterBypass fb, int offs, int length,
String str, AttributeSet a) throws BadLocationException {
String text = fb.getDocument().getText(0,
fb.getDocument().getLength());
text += str;
if (text.matches("^\\d+\\.?\\d*$")) { // "^[0-9]+[.]?[0-9]{0,}$"
super.replace(fb, offs, length, str, a);
} else {
Toolkit.getDefaultToolkit().beep();
}
}
@Override
public void insertString(FilterBypass fb, int offs, String str,
AttributeSet a) throws BadLocationException {
String text = fb.getDocument().getText(0,
fb.getDocument().getLength());
text += str;
if (text.matches("^\\d+\\.?\\d*$")) {
super.insertString(fb, offs, str, a);
} else {
Toolkit.getDefaultToolkit().beep();
}
}
});
return field;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new FilterDemo();
}
});
}
}
这可能是最简单的代码:
if (text.matches("\\d+(\\.\\d+)?"))
如果有点,后面必须跟一些数字。如果你想允许一个点,那么也不要数字,把改成
*
:
if (text.matches("\\d+(\\.\\d*)?"))
请注意,对于String#matches()
,前导/尾随^
/$
是不必要的,因为整个字符串必须匹配matches()
才能返回true
。
不允许前导数字也变得更加棘手,因为正则表达式(\d)?(\。\d*)
匹配空白字符串,因此需要替换:
if (text.matches("\\d+(\\.\\d*)?|\\.\\d+"))
或者是消极的展望:
if (text.matches("(?!$)\\d*(\\.\\d*)?"))
little look head断言开始后的下一个位置不是结束(即输入不是空的)。
我有一个文本字段,我只接受键盘上的数字,但现在我必须更改它,因为它是“价格文本字段”,我还需要接受一个点”。“对于任何价格。 我怎样才能改变这个以得到我需要的?
我希望我的文本字段只接受数字(数字)和一个点,因为这是一个用户可以在其中写入产品价格的字段。我有这个代码,但它不能很好地工作,它只接受数字和删除。 有人能帮我修一下吗?
我正在开发一个数独小程序,我想制作它的单元格(扩展JTextField),以便它只接受0-9和长度为1之间的整数。稍后我会对它进行更多限制(以便它符合游戏规则)。我从: 在这里,我试图过滤输入,对于开始,我只是试图将其限制为整数和一个数字,但似乎我可以输入任意多的数字,而最后一行不会被触发。 想在这里得到一些帮助,谢谢:
我正在用JavaStruts开发一个博客,我想知道什么时候打开一篇文章(所有记录都由数据库显示),而不是如何让链接看到下一篇文章和上一篇文章。 请帮我做链接。
如何将数字(0-255内的随机整数)转换为二进制并将位存储为8位数组。(java)
本文向大家介绍如何限制UITextField在Swift中只接受数字?,包括了如何限制UITextField在Swift中只接受数字?的使用技巧和注意事项,需要的朋友参考一下 在iOS应用中,有时我们需要将文本字段限制为仅将数字作为输入,这可以通过多种方式完成,下面让我们来看一些。 方法1:从情节提要中更改文本字段类型。 选择要限制为数字输入的文本字段。 转到其属性检查器。 选择键盘类型,然后从中