【问题标题】:How to make JFormattedTextField accept integer without decimal point (comma)?如何使 JFormattedTextField 接受不带小数点(逗号)的整数?
【发布时间】:2013-01-06 05:34:44
【问题描述】:

我以这种方式使用JFormattedTextFieldNumberFormat

-创建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,是因为它的输入限制优势。

【问题讨论】:

    标签: java swing integer number-formatting jformattedtextfield


    【解决方案1】:

    试试这个,这是创建和验证号码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");
    

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      【讨论】:

        【解决方案3】:

        我找到了解决问题的方法; 这里是:

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

        1000 呈现为 1,000

        10000 呈现为 10,000

        1000000 呈现为 1,000,000

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

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

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

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

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

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

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

        问候

        【讨论】:

        • 我不建议这样做,因为您依赖于特定的默认语言环境。如果您在具有不同语言环境的计算机上使用该程序,您将获得不同的分隔符('.' 表示德国,' ' 表示法语等)。链接的问题包含更好的答案!
        【解决方案4】:

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

        • 使用 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 不是正确的方法,因为

        您不知道 KeyListener 将按什么顺序收到事件通知,并且密钥可能在到达您之前已经到达文本组件(或者它可能在到达您之前已被使用)

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

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

        并且应该完成这个技巧。有了这个,您可以在游览文本字段中插入最多 5 位数字,在格式化程序的字符串参数中插入更多的 '#' = 用户可以输入更多的数字

        【讨论】:

        • 切勿通过使用KeyListener 修改文本组件。您不知道KeyListeners 将按什么顺序收到事件通知,并且密钥可能在到达您之前已经到达文本组件(或者它可能在到达您之前已被使用)。但是,为文档过滤器 +1
        • 我试过 MaskFormatter ,但我必须准确输入数字的数量,例如;"####" 不会接受小于 1000,我想接受小于这个数字。怎么做?谢谢
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-19
        • 2021-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多