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

时间:2013-01-22 20:58:01

标签: java swing integer number-formatting jformattedtextfield

我以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的原因是受益于其输入限制优势。

4 个答案:

答案 0 :(得分:7)

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

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

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

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

当然,你也无法将它们用于你的输入,但这不是问题所针对的,对吗?

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

答案 1 :(得分:1)

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

确切的问题是,当JFormattedTextFieldNumberFormat一起使用时,JFormattedTextField 会添加逗号','在接下来的3位数之前,例如

  

1000呈现为1,000

     

10000呈现为10,000

     

1000000呈现为1,000,000

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

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

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

老实说,解决方案在Answer,但我会在这里重复一遍

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

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

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

此致

答案 2 :(得分:0)

你可以(至少)以两种方式做到:

  • 使用keyListener
  • 使用DocumentFilter

如果你想使用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检查此链接:How to allow introducing only digits in jTextField?

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

  

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

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

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

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

答案 3 :(得分:0)

尝试一下,这是用于创建和验证号码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");