2011-11-28 79 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',這是一個很好的答案。 –

相關問題