如何使JFormattedTextField接受不带小数点的整数(逗号)?

我以这种方式使用JFormattedTextFieldNumberFormat

– 提供JFormattedTextField引用

 JFormattedTextField integerField; 

– 创建一个NumberFormat引用

 NumberFormat integerFieldFormatter; 

– 在构造函数中:

 integerFieldFormatter = NumberFormat.getIntegerInstance(); integerFieldFormatter.setMaximumFractionDigits(0); integerField = new JFormattedTextField(integerFieldFormatter ); integerField.setColumns(5); 

……….

我的意思是只使用整数,但是当我键入1500这样的数字时,它会在失去焦点后转换为1,500,抛出exception这是它的第一行:

线程“AWT-EventQueue-0”中的exceptionjava.lang.NumberFormatException:对于输入字符串:“1,500”

当我使用JTextField而不是JFormattedTextField正常接受所有整数时,但我想要使用JFormattedTextField的原因是受益于其输入限制优势。

我意识到这是一个古老的问题,但我在同一个问题上偶然发现了它。 由于其他答案对我来说似乎是变通,我仔细研究了NumberFormat方法。

我发现最简单的方法实际上是简单地停用NumberFormat实例上的分组

 NumberFormat integerFieldFormatter = NumberFormat.getIntegerInstance(); integerFieldFormatter.setGroupingUsed(false); 

这样,文本字段输出中不会出现组分隔符。

当然,你也无法使用它们作为你的输入,但这不是问题所针对的,对吧?

同样对于NumberFormat的整数实例,您不需要显式setMaximumFractionDigits(0),因为这是getIntegerInstance()为您所做的一部分。

我发现了解决问题的方法; 是:

确切的问题是,当我使用带有NumberFormat的JFormattedTextField时,JFormattedTextField 在任何后续3位数之前添加逗号’,’,例如

1000渲染为1,000

10000渲染为10,000

1000000渲染为1,000,000

当我从JFormattedTextField读取一个整数值时,请使用这行代码

  int intValue = Integer.parseInt(integerField.getText()); 

逗号作为字符串的一部分读取; 1000读为1,000,此字符串值无法转换为整数值,因此抛出exception。

老实说,解决方案在本答案中,但我将在此重复

使用str.replaceAll(",","")

  int intValue = Integer.parseInt(integerField.getText().replaceAll(",", "")); 

这将替换返回字符串中的任何逗号charach ','并按预期正常转换为int

问候

你可以用(至少)2种方式做到这一点:

  • 使用keyListener
  • 使用DocumentFilter

如果你想使用KeyListener:

 KeyListener listener = new KeyAdapter(){ public void keyTyped(KeyEvent e){ if(e.getKeyCode()KeyEvent.VK_9{//input<'0' or input>'9'? e.consume();//delete the typed char } } } yourTextField.addKeyListener(listener); 

使用DocumentFilter检查此链接: 如何只允许在jTextField中引入数字?

编辑:我忘了说这个。 正如MadProgrammer在对这个答案的第一个评论中所说,KeyListener不是正确的方法,因为

您不知道KeyListeners将以什么顺序通知该事件,并且密钥可能在它到达您之前已经转到文本组件(或者它可能在它到达之前已被消耗)

编辑#2:另一种快速方式

 MaskFormatter formatter = new MaskFormatter("#####"); JFormattedTextField field = new JFormattedTextField(formatter); 

应该做的诀窍。 使用此function,您可以在巡视文本字段中插入最多5位数字,格式化程序的字符串参数中的更多“#”=用户可以输入更多位数