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()实现这些功能。