Java JFormattedTextField中的IllegalArgumentException

Java JFormattedTextField中的IllegalArgumentException,java,text,formatting,Java,Text,Formatting,我需要做自定义文本字段,它将根据本地的格式化方式格式化数值。所以我做了一个分类: public class NumberTextField extends JFormattedTextField {... 构造函数如下所示: public NumberTextField() { formater=new NumberFormatter(); formater.setAllowsInvalid( false ); nf=NumberFormat.getIns

我需要做自定义文本字段,它将根据本地的格式化方式格式化数值。所以我做了一个分类:

public class NumberTextField extends JFormattedTextField 
{...
构造函数如下所示:

  public NumberTextField()
   {

    formater=new NumberFormatter();
    formater.setAllowsInvalid( false );
    nf=NumberFormat.getInstance();
    formater.setFormat( nf );

    this.setFormatter( formater );    
   }
结果是:

Exception in thread "main" java.lang.IllegalArgumentException: Cannot format given Object as a Number
    at java.text.DecimalFormat.format(Unknown Source)
    at java.text.Format.format(Unknown Source)
    at javax.swing.text.InternationalFormatter.valueToString(Unknown Source)
    at javax.swing.JFormattedTextField$AbstractFormatter.install(Unknown Source)
    at javax.swing.text.DefaultFormatter.install(Unknown Source)
    at javax.swing.text.InternationalFormatter.install(Unknown Source)
    at javax.swing.JFormattedTextField.setFormatter(Unknown Source)
    at hr.ikb.nasa.gui.custom.NumberTextField.<init>(NumberTextField.java:65)
    at hr.ikb.nasa.gui.custom.NumberTextField.main(NumberTextField.java:35)
线程“main”java.lang.IllegalArgumentException中的异常:无法将给定对象格式化为数字 位于java.text.DecimalFormat.format(未知源) at java.text.Format.Format(未知源) 位于javax.swing.text.InternationalFormatter.valueToString(未知源) 位于javax.swing.JFormattedTextField$AbstractFormatter.install(未知源) 位于javax.swing.text.DefaultFormatter.install(未知源) 位于javax.swing.text.InternationalFormatter.install(未知源代码) 位于javax.swing.JFormattedTextField.setFormatter(未知源) 在hr.ikb.nasa.gui.custom.NumberTextField.(NumberTextField.java:65) 位于hr.ikb.nasa.gui.custom.NumberTextField.main(NumberTextField.java:35) 既然谷歌不能提供有用的东西,我想看看你能说些什么。也许它没有任何价值需要处理-我试图在构造函数
中放入this.setValue(新的双精度(0.0d))
此.setText(“0”)-这没有帮助。

(根据我下面的评论):对
JFormattedTextField
进行子分类并调用受保护的
setFormat
方法可能不是正确的方法。从API文档中:

通常不应调用此函数,而应设置AbstractFormatterFactory或设置值

相反,我建议不要对JFormattedTextField进行子分类,而是使用
JFormattedTextField(AbstractFormatter)
构造函数创建一个。我将保留下面原始响应中的代码,以防它有用-我通常在输入数值是可选的,因此空白文本字段应表示为null时使用此格式化程序

public class BlankAsNullNumberFormatter extends NumberFormatter {
    private static final long serialVersionUID = 5867546077017490042L;

    public BlankAsNullNumberFormatter(Class<? extends Number> numberKlazz) {
        setValueClass(numberKlazz);
    }

    public BlankAsNullNumberFormatter(Class<? extends Number> numberKlazz, NumberFormat format) {
        super(format);
        setValueClass(numberKlazz);
    }

    public String valueToString(Object iv) throws ParseException {
        if (iv == null) {
            return "";
        } else {
            return super.valueToString(iv);
        }
    }

    public Object stringToValue(String text) throws ParseException {
        if ("".equals(text)) {
            return null;
        }

        return super.stringToValue(text);
    }
}
公共类BlankAsNullNumberFormatter扩展了NumberFormatter{
私有静态最终长serialVersionUID=5867546077017490042L;

public BlankAsNullNumberFormatter(Classnope…尝试了您的代码,复制粘贴了它,但仍然存在相同的错误。使用BlankAsNullNumberFormatter(ClassI)实例化了它。我认为您不应该对JFormattedTextField进行子分类并调用受保护的setFormatter方法。相反,请尝试使用JFormattedTextField创建JFormattedTextField(JFormattedTextField.AbstractFormatter)构造函数。如果这是GUI小部件,应该从调色板拖放到表单上,那么如何使用factory。绘制表单的人不应该有太多手工编码的经验,所有内容都必须与表单相关。matisse form builder使用new()实现这些功能。