Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 试铸时遇到的问题_Java_Vaadin_Vaadin7 - Fatal编程技术网

Java 试铸时遇到的问题

Java 试铸时遇到的问题,java,vaadin,vaadin7,Java,Vaadin,Vaadin7,我有一个扩展TextField的类。这个类将文本转换为大写,现在我尝试使用BeanFieldGroup对这个类进行强制转换,但不起作用。 使用TextField是可行的,但是我的类扩展了TextField却不行 /** class transfor text to uppercase */ public class TextUpper extends TextField implements TextChangeListener{ public TextUpper(Integer le

我有一个扩展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);
/**将文本转换为大写的类*/
公共类TextUpper扩展TextField实现TextChangeListener{
公共文本上限(整数长度){
超级();
setMaxLength(长度);
setImmediate(true);
setTextChangeEventMode(TextChangeEventMode.EAGER);
addTextChangeListener(此);
}
公共文本上限(){
超级();
}
@凌驾
公共void textChange(textchangevent事件){
String text=event.getText();
setValue(text.toUpperCase());
}
}
binder=新BeanFieldGroup(MyBean.class);
binder.setItemDataSource(ag);
字段=空;
Field=binder.buildAndBind(“名称”、“名称”);
//用TextUpper铸造
TextUpper name=(TextUpper)binder.getField(“名称”);
表格.添加组件(名称);
有什么想法吗?

我想binder.getField()会返回一个文本字段。 所以在TextUpper name=(TextUpper)binder.getField(“name”)之后;它仍然是一个文本字段,你可以通过

name instanceof TextUpper
强制转换不会更改其类型。你只会说“我知道这是一个TextUpper,一种特殊类型的TextField”,但它不是,你只是让它看起来像。 因此,如果之后执行强制转换和调用方法,对象仍将调用TextField的方法,而不是TextUpper的方法。 您必须创建一个新的TextUpper,从TextField中设置文本(和其他值),并使用此对象(如果您想了解其行为)

或者,只是使用

buildAndBind(String caption,
                                        Object propertyId,
                                        Class<T> fieldType)

我有一种强烈的感觉,buildAndBind调用无参数构造函数,因为您没有将参数的长度放在任何地方

什么意思是“不工作”?是的,提供特定的失败消息。我正在尝试这样做:Field Field=binder.buildAndBind(“Name”、“Name”、TextUpper.class);但仍然不起作用。什么不起作用,你期望什么?如果所有方法都按预期调用,您是否尝试过调试?目前无法检查这一点,但您只能在构造函数中使用参数进行调试。将方法调用添加到无参数构造函数。这些主要由default调用。您是否也将初始化内容放入无参数构造函数中?尝试了强制转换,但不起作用。将显示强制转换异常。尝试使用buildAndBind(“Name”、“Name”、TextUpper.class),但在我完成角色转换后也无法正常工作。使用instanceof将true返回到TextUpper,但文本不会转换为大写。
 public TextUpper(Integer length){
        super();
        setMaxLength(length);   
        setImmediate(true);
        setTextChangeEventMode(TextChangeEventMode.EAGER);
        addTextChangeListener(this);
    }

    public TextUpper(){
        super(); 
        setImmediate(true);
        setTextChangeEventMode(TextChangeEventMode.EAGER);
        addTextChangeListener(this);
    }