Java 试铸时遇到的问题
我有一个扩展TextField的类。这个类将文本转换为大写,现在我尝试使用BeanFieldGroup对这个类进行强制转换,但不起作用。 使用TextField是可行的,但是我的类扩展了TextField却不行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
/** 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);
}