【问题标题】:IllegalArgumentException in JFormattedTextFieldJFormattedTextField 中的 IllegalArgumentException
【发布时间】:2009-07-06 09:02:58
【问题描述】:

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

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"); - 它没有帮助..

【问题讨论】:

    标签: java text formatting


    【解决方案1】:

    (根据我在下面的评论):子类化 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(Class extends Number> numberKlazz) 实例化它,所以实际上我根本不知道它是否有格式,也会尝试检查..
    • 我不认为你应该继承 JFormattedTextField 并调用受保护的 setFormatter 方法。而是尝试使用 JFormattedTextField(JFormattedTextField.AbstractFormatter) 构造函数创建 JFormattedTextField。
    • 好吧......如果这是应该从调色板拖放到表单上的 GUI 小部件,如何使用工厂。绘制表单的人不应该有太多的手工编码经验,一切都必须与表单相关.. 而 matisse form builder 使用 new() 来处理这些事情。
    猜你喜欢
    • 2015-11-24
    • 2012-08-03
    • 1970-01-01
    • 2011-11-14
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多