尝试铸造的问题

时间:2014-03-10 14:14:06

标签: java vaadin vaadin7

我有一个扩展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);

任何想法???

1 个答案:

答案 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,因为你没有把参数放在任何地方