2014-05-05 2 views
2

J'essaie de créer un RadioField, comme (oui, non, inconnu). Pour "oui" j'ai un champ de texte. Je veux que si quelque chose est tapé sur le champ de texte, "oui" sera sélectionné sur le radiobutton. J'ai essayé, mais je reçois une exception:Ajout d'un écouteur sur un Wicket TextField

size = new NumberField<Double>("size", fieldLabel("size"), HasUnits.MICROMETER); 

size.add(new AjaxFormComponentUpdatingBehavior("onchange") { 

    private static final long serialVersionUID = 
     2462233190993745889L; 

    @Override 
    protected void onUpdate(final AjaxRequestTarget target) { 
     downSet.setDefaultModelObject("yes"); 
    } 
}); 
add(size); 
size.setOutputMarkupId(true); 

est l'exception ici, je reçois:

org.apache.wicket.WicketRuntimeException: Behavior redb.main.modules.sample.view.details.pck.DownSetPanel$2 can only be added to an instance of a FormComponent 
    at org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior.onBind(AjaxFormComponentUpdatingBehavior.java:79) ~[wicket-core-6.8.0.jar:6.8.0] 
    at org.apache.wicket.behavior.AbstractAjaxBehavior.bind(AbstractAjaxBehavior.java:68) ~[wicket-core-6.8.0.jar:6.8.0] 
    at org.apache.wicket.Behaviors.add(Behaviors.java:59) ~[wicket-core-6.8.0.jar:6.8.0] 
    at org.apache.wicket.Component.add(Component.java:4511) ~[wicket-core-6.8.0.jar:6.8.0] 
    at redb.main.modules.sample.view.details.pck.DownSetPanel.onInitialize(DownSetPanel.java:61) ~[DownSetPanel.class:na] 
    at org.apache.wicket.Component.fireInitialize(Component.java:863) ~[wicket-core-6.8.0.jar:6.8.0] 
    at org.apache.wicket.MarkupContainer$3.component(MarkupContainer.java:961) ~[wicket-core-6.8.0.jar:6.8.0] 
    at org.apache.wicket.MarkupContainer$3.component(MarkupContainer.java:957) ~[wicket-core-6.8.0.jar:6.8.0] 
    at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:144) ~[wicket-util-6.8.0.jar:6.8.0] 
    at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:162) ~[wicket-util-6.8.0.jar:6.8.0] 
    at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:162) ~[wicket-util-6.8.0.jar:6.8.0] 
    at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:162) ~[wicket-util-6.8.0.jar:6.8.0] 
    at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:162) ~[wicket-util-6.8.0.jar:6.8.0] 
    at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:123) ~[wicket-util-6.8.0.jar:6.8.0] 
    at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:192) ~[wicket-util-6.8.0.jar:6.8.0] 
    at org.apache.wicket.MarkupContainer.visitChildren(MarkupContainer.java:875) ~[wicket-core-6.8.0.jar:6.8.0] 

Et ma NumberField classe:

public class NumberField<T extends Number & Comparable<T>> extends SampleField implements HasUnits { 

    private static final long serialVersionUID = 4885709350741384398L; 

    private NumberInput<T> numberInput; 
    private String unit; 

    public NumberField(String id, IModel<String> fieldLabel, IModel<T> model) { 
     super(id, fieldLabel, model); 
    } 

    public NumberField(String id, IModel<String> fieldLabel) { 
     super(id, fieldLabel); 
    } 

    public NumberField(String id, IModel<String> fieldLabel, String unit) { 
     super(id, fieldLabel); 
     this.unit = unit; 
    } 

    @SuppressWarnings("unchecked") 
    public void onInitialize() { 
     super.onInitialize(); 
     Form<T> f = new Form<>("form"); 
     this.numberInput = new NumberInput<T>("value", 
      (IModel<T>) getDefaultModel()); 
     this.numberInput.setUnit(unit); 
     f.add(numberInput); 
     add(f); 
    } 

} 

Le SampleField classe:

public abstract class SampleField extends Panel { 

    private static final long serialVersionUID = 1L; 

    public SampleField(String id, IModel<String> fieldLabel) { 
     super(id); 
     addFieldName(fieldLabel); 
    } 

    public SampleField(String id, IModel<String> fieldLabel, IModel<?> model) { 
     super(id, new CompoundPropertyModel<>(model)); 
     addFieldName(fieldLabel); 
    } 

    private final void addFieldName(IModel<String> fieldLabel) { 
     add(new Label("fieldname", fieldLabel)); 
    } 

} 

Quelqu'un at-il une idée sur la façon dont je peux résoudre ce problème?

+1

Quelle est cette classe NumberField que vous utilisez? Apparemment, ce n'est pas un composant Wicket (formulaire) standard, celui-ci s'appelle NumberTextField. – Gimby

+0

désolé oublié de poster .. – ZelelB

+0

@Gimby une idée? – ZelelB

Répondre

1

Essayez avec un AjaxEventBehavior ("change") sur votre NumberField. Pour quelque chose de plus sérieux, vous devrez ajouter le comportement à numberInput enveloppé.

+0

Merci! C'était la meilleure/la plus simple solution! – ZelelB

4

Vous devez étendre SampleField à partir de FormComponent si vous souhaitez un composant de formulaire personnalisé pouvant utiliser AjaxFormComponentUpdatingBehavior. Mais je ne suis pas sûr que vous ayez vraiment besoin d'un composant de formulaire personnalisé et pas seulement d'un TextField ("taille").

Questions connexes