当使用JFormattedTextField
浮点数时,我无法看到点后面的部分。例如:如果我填写3.14,格式化的文本字段将其替换为3?
JFormattedTextField aR = new JFormattedTextField(new Float(0.00));
aR.addPropertyChangeListener("value", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
System.out.println(evt.getNewValue());
}
});
答案 0 :(得分:5)
For instance: if I fill in 3.14, the formatted text field replaces this to 3?
不太可能是3
,而是3.1
。
因为当您调用构造函数new JFormattedTextField(Object)
时,它会调用setValue(object)
函数,该函数最终会尝试创建与{{Type}相对应的formatter factory
1}}通过调用object value
函数,其中getDefaultFormatterFactory(Object type)
的默认formatter
创建如下:
float
从这段代码中,你应该注意到它会创建带有掩码if (type instanceof Number) {
AbstractFormatter displayFormatter = new NumberFormatter();
((NumberFormatter)displayFormatter).setValueClass(type.getClass());
AbstractFormatter editFormatter = new NumberFormatter(
new DecimalFormat("#.#"));
((NumberFormatter)editFormatter).setValueClass(type.getClass());
return new DefaultFormatterFactory(displayFormatter,
displayFormatter,editFormatter);
}
的{{1}}。
因此,请尝试在DecimalFormat
构造函数中添加"#.#"
掩码DecimalFormat
:
"#.##"
你应该好好去。
答案 1 :(得分:3)
NumberFormat
,DecimalNumberFormat
。 e.g。
FormattedTextField.setFormatterFactory(new AbstractFormatterFactory() {
@Override
public AbstractFormatter getFormatter(JFormattedTextField tf) {
NumberFormat format = DecimalFormat.getInstance();
format.setMinimumFractionDigits(2);
format.setMaximumFractionDigits(2);
format.setRoundingMode(RoundingMode.HALF_UP);
InternationalFormatter formatter = new InternationalFormatter(format);
formatter.setAllowsInvalid(false);
formatter.setMinimum(0.0);
formatter.setMaximum(1000.00);
return formatter;
}
});
DocumentListener
代替JTextComponent
代替PropertyChangeListener
,取决于您是否想要倾听所有更改,或者最终结果是否重要