5

我以这种方式使用JFormattedTextFieldwith :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

4 回答 4

10

我意识到这是一个老问题,但我只是通过同样的问题偶然发现了它。由于其他答案对我来说似乎是解决方法,因此我仔细研究了 NumberFormat 方法。

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

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

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

当然,您也无法将它们用于您的输入,但这不是问题的本意,对吧?

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

于 2015-05-29T14:44:48.537 回答
1

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

确切的问题是,当我使用JFormattedTextFieldwith时NumberFormat,JFormattedTextField在接下来的 3 位数字之前添加逗号“,”

1000 呈现为 1,000

10000 呈现为 10,000

1000000 呈现为 1,000,000

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

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

逗号作为字符串的一部分被读取;1000 读为 1000 并且这个字符串值不能转换为整数值,所以抛出异常。

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

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

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

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

问候

于 2013-01-23T06:36:46.510 回答
0

您可以通过(至少)两种方式做到这一点:

  • 使用 keyListener
  • 使用文档过滤器

如果你想使用 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 位数字,在格式化程序的字符串参数中插入更多“#”=用户可以输入更多数字

于 2013-01-22T21:04:26.467 回答
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");
于 2019-02-14T20:08:41.093 回答