[英]How to make JFormattedTextField accept integer without decimal point (comma)?
我以这种方式使用JFormattedTextField
和NumberFormat
:
- 提供JFormattedTextField
引用
JFormattedTextField integerField;
- 创建一个NumberFormat
引用
NumberFormat integerFieldFormatter;
- 在构造函数中:
integerFieldFormatter = NumberFormat.getIntegerInstance();
integerFieldFormatter.setMaximumFractionDigits(0);
integerField = new JFormattedTextField(integerFieldFormatter );
integerField.setColumns(5);
..........
我打算只使用整数,但是当我键入1500之类的数字时,它会在失去焦点后转换为1,500,抛出异常这是它的第一行:
线程“AWT-EventQueue-0”中的异常java.lang.NumberFormatException:对于输入字符串:“1,500”
当我使用JTextField
而不是JFormattedTextField
正常接受所有整数时,但我想使用JFormattedTextField
的原因是受益于其输入限制优势。
我意识到这是一个古老的问题,但我在同一个问题上偶然发现了它。 由于其他答案对我来说似乎是变通,我仔细研究了NumberFormat方法。
我发现最简单的方法实际上是简单地停用NumberFormat实例上的分组 :
NumberFormat integerFieldFormatter = NumberFormat.getIntegerInstance();
integerFieldFormatter.setGroupingUsed(false);
这样,文本字段输出中不会出现组分隔符。
当然,您也无法将它们用于输入,但这不是问题所针对的,对吧?
同样对于NumberFormat的整数实例,您不需要显式setMaximumFractionDigits(0),因为这是getIntegerInstance()为您所做的一部分。
我发现了解决问题的方法; 这是:
确切的问题是,当我使用JFormattedTextField
与NumberFormat
,JFormattedTextField上之前的任何未来的3个数字,例如添加逗号“”
1000渲染为1,000
10000渲染为10,000
1000000呈现为1,000,000
当我从JFormattedTextField读取一个整数值时,请使用这行代码
int intValue = Integer.parseInt(integerField.getText());
逗号被读作字符串的一部分; 1000读为1,000,此字符串值无法转换为整数值,因此抛出异常。
老实说,解决方案在本答案中,但我将在此重复
使用str.replaceAll(",","")
int intValue = Integer.parseInt(integerField.getText().replaceAll(",", ""));
这将替换返回字符串中的任何逗号charachter ','
并按预期正常转换为int
。
问候
你可以用(至少)两种方式做到这一点:
如果你想使用KeyListener:
KeyListener listener = new KeyAdapter(){
public void keyTyped(KeyEvent e){
if(e.getKeyCode()<KeyEvent.VK_0||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);
应该做的诀窍。 使用此功能,您可以在巡视文本字段中插入最多5位数字,格式化程序的字符串参数中的“#”更多=用户可以输入更多数字
试试这个,这是一个用于创建和验证数字JTextField
的完整解决方案
NumberFormat format = NumberFormat.getInstance();
format.setGroupingUsed(false);//Remove comma from number greater than 4 digit
NumberFormatter sleepFormatter = new NumberFormatter(format);
sleepFormatter.setValueClass(Integer.class);
sleepFormatter.setMinimum(0);
sleepFormatter.setMaximum(3600);
sleepFormatter.setAllowsInvalid(false);
sleepFormatter.setCommitsOnValidEdit(true);// committ value on each keystroke instead of focus lost
JFormattedTextField textFieldSleep = new JFormattedTextField(sleepFormatter);
textFieldSleep.setText("0");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.