0

使用JFormattedTextFieldfor 浮点数时,我无法看到点后的部分。例如:如果我填写 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());      
    }
}); 
4

2 回答 2

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)函数最终会尝试通过调用函数创建一个formatter factory对应于 Type of的函数,其中默认的 for创建如下:object valuegetDefaultFormatterFactory(Object type)formatterfloat

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);
        }

从这段代码中,您应该已经注意到它创建了DecimalFormatwith mask "#.#"。所以尝试在构造函数中添加DecimalFormatwith 掩码:"#.##"JFormattedTextField

JFormattedTextField feild = new JFormattedTextField(new DecimalFormat("#.##"));
feild.setValue(new Float(3.34)); 

你应该很高兴。

于 2013-11-06T20:45:29.503 回答
3
  • 您需要设置小数位数NumberFormatDecimalNumberFormat

. 例如

    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;
        }
    });
  • 可能使用DocumentListenerfor JTextComponents 而不是PropertyChangeListener,取决于您是否要监听所有更改或最终结果仅重要
于 2013-11-06T20:46:13.973 回答