我有一个扩展TextField的类。这个类将文本转换为大写,现在我正在尝试使用BeanFieldGroup对此类进行转换但不起作用。 使用TextField可以正常工作,但是扩展TextField的类没有。
/** class transfor text to uppercase */
public class TextUpper extends TextField implements TextChangeListener{
public TextUpper(Integer length){
super();
setMaxLength(length);
setImmediate(true);
setTextChangeEventMode(TextChangeEventMode.EAGER);
addTextChangeListener(this);
}
public TextUpper(){
super();
}
@Override
public void textChange(TextChangeEvent event) {
String text = event.getText();
setValue(text.toUpperCase());
}
}
binder = new BeanFieldGroup<MyBean>(MyBean.class);
binder.setItemDataSource(ag);
Field<?> field = null;
Field field = binder.buildAndBind("Name", "name");
// Casting with TextUpper
TextUpper name = (TextUpper)binder.getField("name");
form.addComponent(name);
任何想法???
答案 0 :(得分:1)
我猜binder.getField()返回一个TextField。 所以在TextUpper name =(TextUpper)之后binder.getField(“name”);它仍然是一个TextField,你可以通过
来检查name instanceof TextUpper
演员阵容不会改变其类型。你只说“我知道这是一个TextUpper,一种特殊类型的TextField”,但它不是,你只是看起来像。 因此,如果您之后执行强制转换和调用方法,该对象仍将调用TextField的方法,而不是TextUpper方法。 您必须创建一个新的TextUpper,从TextField设置文本(和其他值),如果您想要它的行为,请使用此对象。
或者,只需使用
buildAndBind(String caption,
Object propertyId,
Class<T> fieldType)
使用TextUpper:)
https://vaadin.com/download/prerelease/7.0/7.0.0/7.0.0.alpha3/docs/api/com/vaadin/data/fieldgroup/FieldGroup.html#buildAndBind(java.lang.String,java.lang.Object,java.lang.Class)
试试这个:
public TextUpper(Integer length){
super();
setMaxLength(length);
setImmediate(true);
setTextChangeEventMode(TextChangeEventMode.EAGER);
addTextChangeListener(this);
}
public TextUpper(){
super();
setImmediate(true);
setTextChangeEventMode(TextChangeEventMode.EAGER);
addTextChangeListener(this);
}
我强烈感觉buildAndBind调用参数less constructor,因为你没有把参数放在任何地方