2011-11-28 73 views
0

我正在致力于一个定制小部件,我打电话给SelectionField,它(简称)为ListBox增加了功能,主要用于支持我们的HasDisplayText接口。下面是会解释我的意思的方法:在自定义小部件中模仿成员字段?

public <T extends Enum<?> & HasDisplayText> void addItems(T [] items) { 
    if (items != null && items.length > 0) { 
     for (T item : items) { 
      selectionField.addItem(item.getDisplayText(), item.name()); 
     } 
    } 
} 

我把这种方法是这样的:

selectionField.addItems(TimeZone.values()); 

我想有一个属性(用的getter/setter)enumClass,使用户致电setEnumClass(TimeZone)。我很难弄清楚如何做到这一点,同时确保传入的Enum类肯定会实现HasDisplayText

这工作:

public <T extends Enum<?> & HasDisplayText> void setEnumClass(Class<T> enumClass) { 
    if (enumClass != null) { 
     T[] constants = enumClass.getEnumConstants(); 
     addItems(constants); 
    } 
} 

...但现在我想声明一个成员场this.enumClass,因此它可以被设置为来电enumClass。显然private <T extends Enum<?> & HasDisplayText> Class<T> enumClass不起作用。我可以将该字段声明为private Class<?> enumClass,务必对传入的类进行检查,并将其转换为来自getter的返回值,但这似乎更像是一种比正确方法更好的解决方法。

(作为奖励,我也希望能够编辑UiBinder的这个属性甚至GWT Designer中如果可能的话)。

如何能不能做到?

回答

1

是否让整个窗口小部件类为您的选项?如果是的话,这应该工作:以上

public class GenericBinderComposite<T extends Enum<?> & HasDisplayText> extends Composite { 

    private static GenericBinderCompositeUiBinder uiBinder = GWT.create(GenericBinderCompositeUiBinder.class); 
    interface GenericBinderCompositeUiBinder extends UiBinder<Widget, GenericBinderComposite<?>> {} 

    private T enumClass; 

    public GenericBinderComposite() { 
     initWidget(uiBinder.createAndBindUi(this)); 
    } 
    public T getEnumClass() { 
     return enumClass; 
    } 
    public void setEnumClass(T enumClass) { 
     this.enumClass = enumClass; 
    } 

} 

意味着当然的GenericBinderComposite.ui.xml存在。

+0

虽然我实际上直接从ListBox扩展'public class SelectionField &HasDisplayText> extends ListBox',这是一个很好的答案。 –

相关问题