2011-12-07 2 views
3

Je me demande s'il existe un moyen de construire la logique gwt uibinder dans une classe parente abstraite afin que je n'aie pas à répéter le code dans chaque classe que je veux lier.gwt uibinder dans une classe parent abstraite

par exemple, je voudrais pouvoir faire quelque chose comme ceci:

public abstract class BasePanel<Panel extends BasePanel> extends Composite { 
    interface Binder<BinderPanel extends BasePanel> extends UiBinder<Widget, BinderPanel> { } 
    private static final Binder binder = GWT.create(Binder<Panel>.class); 

    public BasePanel() { 
     initWidget(binder.createAndBindUi(this)); 
     init(); 
    } 
} 

En gros, cela permettrait à toutes les classes d'enfants de faire quelque chose comme ceci:

public MyPanel extends BasePanel<MyPanel> { 
    //my code here 
} 

le constructeur par défaut prendrait soin de tout le code pour lier MyPanel à MyPanel.ui.xml.

Fondamentalement, je veux être paresseux et seulement avoir à construire l'interface et le liant une fois pour que ce soit fait d'une manière commune. pensées?

merci d'avance.

Répondre

6

Une bonne façon de faire des classes abstraites de lieurs d'interface utilisateur consiste à définir une super classe qui contiendra une logique commune à tous les widgets de sous-classe. Cette classe peut avoir des champs marqués @UiField, des gestionnaires d'événements et tout autre élément entrant dans la classe de lieur d'interface utilisateur. Et les classes enfant ont en fait une logique d'instanciation de lieur d'interface utilisateur. Donc, quelque chose comme ceci:

public abstract BaseWidget extends Composite { 
    @UiField TextBox textBoxCommon1; 
    @UiField TextBox textBoxCommon2; 

    @UiHandler("textBoxCommon1") 
    void onTextBoxCommon1Changed(ValueChangeEvent<String> event) { 
    //... 
    } 

    @UiHandler("textBoxCommon2") 
    void onTextBoxCommon2Changed(ValueChangeEvent<String> event) { 
    //... 
    } 
} 

public class SomeWidget extends BaseWidget { 
    interface SomeWidgetUiBinder extends UiBinder<Widget,SomeWidget> {} 

    private static SomeWidgetUiBinder uiBinder = GWT.create(SomeWidgetUiBinder.class); 

    @UiField Button someWidgetButton; 

    public SomeWidget() { 
    initWidget(uiBinder.createAndBindUi(this)); 
    } 

    @UiHandler("someWidgetButton") 
    void onButtonClicked(ClickEvent e) { 
    Window.alert(textBoxCommon1.getValue()); 
    } 
} 
+0

Si vous voulez également éviter le code ui.xml dupliqué, vous devriez toujours prendre cette route. Placez le code de disposition en double dans un widget complètement séparé, cependant. Ce widget séparé devrait implémenter 'HasWidgets', et ensuite vous pouvez l'utiliser dans tous vos différents fichiers subclass.ui.xml. –

+0

J'ai fait les deux suggestions (champs communs dans le widget de base et réduction de ui.xml). Je me demandais vraiment si les appels liants pourraient être aussi abstraits. ça sonne comme @strelock vous dites qu'il ne peut pas corriger? – jctierney

Questions connexes