vaadin表格浮点字段

时间:2012-11-07 16:41:28

标签: java forms input vaadin

我有一个带有表单的vaadin应用程序,我使用beanitem作为数据源。 在beanitem里面我有一个默认值为0.0的浮点值。 如果我输入一个像123123123这样的高值并提交(它保存到数据库),当我尝试在表单中编辑该字段时,我得到1.23123123E9作为值,为什么? 当我编辑我仍然传递带有数据的beanitem时,为什么它不能在文本字段中正确显示我的值?

我知道我是否必须显示我可以使用decimal format的值,但这是在表单中,并且vaadin知道它是一个浮点数,所以它应该相应地处理它吗? 或者我必须自己在表单字段工厂中进行格式化吗?

PS:如何为表单内的值设置显示模式?我已经读过你可以在bean里面实现字段的get并让它返回一个字符串,这是正确的方法吗?

2 个答案:

答案 0 :(得分:6)

实际上Vaadin行为正确,但它遵循规模规则(已经由Yogendra Singh提及)请参阅example

enter image description here

请检查以下内容:

    float value1 = 12.0f;
    float value2 = 123123123;

    BeanItem<Float> item1 = new BeanItem<Float>(value1);
    BeanItem<Float> item2 = new BeanItem<Float>(value2);

    System.out.println(" result 1: " + item1.getBean());
    System.out.println(" result 2: " + item2.getBean());

结果:

result 1: 12.0
result 2: 1.2312312E8

所以正确的解决方案(我可以看到)如下所示:

  1. 定义自己的Bean。没有理由让BeanItem包装浮点值。
  2. 定义您的PropertyFormatter(example
  3. 重要的是要注意,不应该返回String而不是正确的数据类型。它会影响编辑,验证等。
  4. PropertyFormatter示例:

    /** Integer formatter that accepts empty values. */
    public class LenientIntegerFormatter extends PropertyFormatter {
    
        public LenientIntegerFormatter(Property propertyDataSource) {
            setPropertyDataSource(propertyDataSource);
        }
    
        @Override
        public Object parse(String formattedValue) throws Exception {
            if ("".equals(formattedValue))
                return null;
            else
            return Integer.valueOf(formattedValue);
        }
    
        @Override
        public String format(Object value) {
            if (value == null)
                return "";
    
            return ((Integer) value).toString();
        }
    
        @Override
        public Class<?> getType() {
            return String.class;
        }
    }
    

    看起来有点可怕,但这是灵活性的代价。 Custom Bean允许使用表视图,表单等,而无需任何重大更改。基本上,这是Vaadin UI背后的数据模型。

    enter image description here

    Chapter 9. Binding Components to Data

    自定义Bean示例:

    public class Bean implements Serializable {
        String name;
        float value;
    
        public Bean(String name, float newValue) {
            this.name   = name;
            this.value = newValue;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public float getValue() {
            return value;
        }
    
        public void setValue(float newValue) {
            this.value = newValue;
        }
    }
    

    只是提供所有必要的见解:

     Bean bean = new Bean("Test", value1);
        BeanItem<Bean> beanItem = new BeanItem<Bean>(bean);
        for(Object propertyId: beanItem.getItemPropertyIds()) {
            System.out.println(" Property: '" + propertyId + 
                               "' value: " + beanItem.getItemProperty(propertyId));
        }
    

    将打印:

    Property: 'name' value: Test
    Property: 'value' value: 12.0
    

答案 1 :(得分:1)

toString()内部调用toString(float)这就是文档对toString(float)所说的

  

否则,结果是一个字符串,表示参数的符号和幅度(绝对值)。如果符号为负数,则结果的第一个字符为' - '('\ u002D');如果符号为正,则结果中不会出现符号字符。至于幅度m:

     
      
  • 如果m大于或等于10-3但小于107,那么它表示为m的整数部分,十进制形式,没有前导零,后跟'。' ('\ u002E'),后跟一个或多个十进制数字,表示m的小数部分。

  •   
  • 如果m小于10 -3或大于或等于107,则令n设为唯一的整数,使得10n≤m≤10。 10N + 1;然后将a设为m和10n的数学上精确的商,使1≤a<1。 10.然后将幅度表示为a的整数部分,作为单个十进制数字,后跟“。”。 ('\ u002E'),后跟表示a的小数部分的十进制数字,后跟字母'E'('\ u0045'),后跟n表示十进制整数,由Integer方法生成。的toString(INT)。

  •   
     

要创建浮点值的本地化字符串表示形式,请使用NumberFormat的子类。

希望这可以帮助您理解WHYHOW来修复它,即使用您在字段工厂中提到的DecimalFormat并返回字符串表示以供显示。