浮点数的JFormattedTextField

时间:2013-11-06 20:34:05

标签: java swing jformattedtextfield

当使用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());      
    }
}); 

2 个答案:

答案 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)

  • 您需要设置NumberFormatDecimalNumberFormat
  • 中的小数位数

。 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,取决于您是否想要倾听所有更改,或者最终结果是否重要