【问题标题】: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】:
      • 您需要在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;
              }
          });
      
      • 可能使用DocumentListener 代替JTextComponents 而不是PropertyChangeListener,这取决于您是否要监听所有更改或最终结果仅重要

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-10
        • 2012-11-18
        • 2022-12-19
        • 1970-01-01
        • 1970-01-01
        • 2018-09-26
        • 2021-06-26
        • 1970-01-01
        相关资源
        最近更新 更多