JFormattedTextField中的IllegalArgumentException

时间:2009-07-06 09:02:58

标签: java text formatting

我需要制作自定义文本字段,根据本地格式化方式格式化数值。所以我做了一个clas:

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)

由于谷歌无法提供有用的东西,我想看看你能说些什么。也许没有价值可以应付 - 我试图加入构造函数this.setValue(new Double(0.0d));this.setText("0"); - 它没有帮助..

1 个答案:

答案 0 :(得分:1)

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

“你通常不应该调用它,而是设置AbstractFormatterFactory或设置值。”

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

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);
    }
}