実際、Vaadin は正しく動作しますが、マグニチュード ルールに従います (既に Yogendra Singh によって言及されています)例を参照してください
以下もご確認ください。
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
したがって、正しい解決策は(私が見ることができるように)次のようになります。
- 独自の Bean を定義します。float 値をラップする BeanItem を持つ理由はありません。
- PropertyFormatter を定義します (例)
- 注意すべき重要なことは、正しいデータ型ではなく文字列を返すべきではないということです。編集、検証などに影響します。
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;
}
}
少し怖く見えるかもしれませんが、これは柔軟性の代償です。カスタム Bean を使用すると、大きな変更を加えることなく、テーブル ビュー、フォームなどを使用できます。基本的に、これは Vaadin UI の背後にあるデータ モデルです。
第9章 データへのコンポーネントのバインド
カスタム 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