我需要制作自定义文本字段,根据本地格式化方式格式化数值。所以我做了一个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");
- 它没有帮助..
答案 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);
}
}