【问题标题】:JFormattedTextField for floats用于浮点数的 JFormattedTextField
【发布时间】:2013-11-07 04:51:04
【问题描述】:
当使用 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());
}
});
【问题讨论】:
标签:
java
swing
jformattedtextfield
【解决方案1】:
For instance: if I fill in 3.14, the formatted text field replaces this to 3?
不太可能是3,而是3.1。
因为当你调用构造函数newJFormattedTextField(Object)时,它会调用setValue(object)函数,该函数最终会尝试通过调用getDefaultFormatterFactory(Object type)来创建对应object value类型的formatter factory函数,其中float的默认formatter创建如下:
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);
}
从这段代码中,您应该注意到它创建了带有掩码"#.#" 的DecimalFormat。
所以尝试在JFormattedTextField 构造函数中添加DecimalFormat 和掩码"#.##":
JFormattedTextField feild = new JFormattedTextField(new DecimalFormat("#.##"));
feild.setValue(new Float(3.34));
你应该很高兴。
【解决方案2】:
- 您需要在
NumberFormat、DecimalNumberFormat 中设置小数位数
。例如
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 代替JTextComponents 而不是PropertyChangeListener,这取决于您是否要监听所有更改或最终结果仅重要