Comment voulez-vous obtenir les valeurs à partir d'une liste déroulante dans Wicket?
J'ai trouvé ce qui suit Guichet exemple de code:
package org.apache.wicket.examples.ajax.builtin;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
/**
* Linked select boxes example
*
* @author Igor Vaynberg (ivaynberg)
*/
public class ChoicePage extends BasePage
{
private String selectedMake;
private final Map<String, List<String>> modelsMap = new HashMap<String, List<String>>(); //map:company->model
/**
* @return Currently selected make
*/
public String getSelectedMake()
{
return selectedMake;
}
/**
* @param selectedMake
* The make that is currently selected
*/
public void setSelectedMake(String selectedMake)
{
this.selectedMake = selectedMake;
}
/**
* Constructor.
*/
public ChoicePage()
{
modelsMap.put("AUDI", Arrays.asList(new String[] { "A4", "A6", "TT" }));
modelsMap.put("CADILLAC", Arrays.asList(new String[] { "CTS", "DTS", "ESCALADE", "SRX",
"DEVILLE" }));
modelsMap.put("FORD", Arrays.asList(new String[] { "CROWN", "ESCAPE", "EXPEDITION",
"EXPLORER", "F-150" }));
IModel<List<? extends String>> makeChoices = new AbstractReadOnlyModel<List<? extends String>>()
{
@Override
public List<String> getObject()
{
Set<String> keys = modelsMap.keySet();
List<String> list = new ArrayList<String>(keys);
return list;
}
};
IModel<List<? extends String>> modelChoices = new AbstractReadOnlyModel<List<? extends String>>()
{
@Override
public List<String> getObject()
{
List<String> models = modelsMap.get(selectedMake);
if (models == null)
{
models = Collections.emptyList();
}
return models;
}
};
Form<?> form = new Form("form");
add(form);
final DropDownChoice<String> makes = new DropDownChoice<String>("makes",
new PropertyModel<String>(this, "selectedMake"), makeChoices);
final DropDownChoice<String> models = new DropDownChoice<String>("models",
new Model<String>(), modelChoices);
models.setOutputMarkupId(true);
form.add(makes);
form.add(models);
makes.add(new AjaxFormComponentUpdatingBehavior("onchange")
{
@Override
protected void onUpdate(AjaxRequestTarget target)
{
target.addComponent(models);
}
});
}
}
Supposons que j'ai la classe suivante:
public class car{
private String name;
private String model;
public setname(String n){
this.name=n;
}
public setModel(String m){
this.model=m;
}
/// and getters...
}
Je veux créer un car
objet dans l'exemple de code, et d'assigner les valeurs sélectionnées dans la liste déroulante de la car
objet. Comment puis-je le faire?
Vous devez vous connecter pour publier un commentaire.
Vous êtes à la recherche pour le
PropertyModel
de la classe. GuichetPropertyModel
s peuvent vous permettre d'attacher de la valeur d'un composant directement une valeur dans votre source. La Javadoc exemple de code estLorsque que l'étiquette est ajouté à la page, il va afficher la valeur dans
person.name
, aucun travail supplémentaire de votre part.Votre voiture à l'exemple de code utilise déjà
PropertyModel
s, de sorte que tous vous avez à faire est de changer de cible. Par exemple:Ceci permettra de définir la valeur de
theCar.name
à ce qui est dans le fait de liste déroulante et la valeur detheCar.model
à ce que les modèles de liste déroulante.EDIT:
Oui, il est possible de définir les valeurs à l'aide d'un bouton au lieu de automatiquement. Pour ce faire, n'utilisez pas le
PropertyModel
s. Au lieu de cela, créer un nouveau GuichetButton
objet et de remplacer sononSubmit()
méthode avec un code commeOu, si vous voulez le faire AJAXically, placez-le à l'intérieur d'un
AjaxFormChoiceComponentUpdatingBehavior
'sonUpdate()
méthode.theCar.name
au lieu deselectedMake
? Je peux poster l'intégralité de la source si vous le souhaitez. Je ne comprends pas votre dernier commentaire; qu'entendez-vous par "obtenir les valeurs sélectionnées"?Il est préférable d'utiliser CompoundPropertyModel sur la forme, sur laquelle vous pouvez ajouter DropDownChoice composants.
Si vous souhaitez avoir DropDownChoice divisée régions, comme celle de "Ford", "Audi", etc.. vous pouvez utiliser le Guichet Sélectionner un composant, vous pouvez lire à ce sujet ici: http://wicket.apache.org/apidocs/1.4/org/apache/wicket/extensions/markup/html/form/select/Select.html .
Et, habituellement, vous pouvez obtenir la valeur de liste Déroulante à l'aide de dropDownName.getModelObject() ou dropDownName.getDefaultModelObject() méthodes. Si cela ne fonctionne pas, vous devriez essayer de voir, ce que
montre, peut-être il ya des problèmes avec le modèle.
Dans le cas où vous utilisez CompoundPropertyModel, vous n'avez pas besoin d'obtenir la valeur directement à partir de DropDownChoice, mais à partir de CompoundPropertyModel, utilisez quelque chose comme: