5 votes

utiliser AutoCompleteTextField dans wicket sans String comme type générique

Cette question en découle : gestion de l'événement onchange du champ AutoCompleteTextField dans wicket

J'essaie d'utiliser le champ AutoCompleteTextField avec une classe personnalisée comme type générique, et d'ajouter un comportement AjaxFormComponentUpdatingBehavior. Ce que je veux dire, c'est que je veux avoir un

AutoCompleteTextField<SomeClass> myAutoComplete = ...;

et ajoutez ensuite un comportement AjaxFormComponentUpdatingBehavior :

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

        @Override
        protected void onUpdate(AjaxRequestTarget target) {
            System.out.println( "Value: "+getValue() );

        }
    });

Le problème est que, pour une raison quelconque, l'ajout de ce comportement fait que le formulaire essaie de définir l'objet modèle avec une chaîne (même si le champ AutoCompleteTextField a un type générique de SomeClass), ce qui provoque une ClassCastException lorsque l'événement onchange se déclenche.

Est-il possible d'utiliser AutoCompleteTextField sans qu'il soit AutoCompleteTextField<String> ? Je n'ai pas trouvé d'exemple. Merci de m'avoir accordé un peu de votre temps !

et grâce à l'utilisateur biziclop pour son aide dans cette affaire.

5voto

biziclop Points 21446

Ce problème n'est pas lié au gestionnaire d'événements, il est dû à l'absence de définition d'un type de modèle dans votre composant.

Les composants du formulaire peuvent dériver le type de modèle à partir de 3 sources :

  1. La résolution se fait automatiquement si vous utilisez un PropertyModel ou un CompoundPropertyModel .
  2. L'accepter comme paramètre supplémentaire du constructeur.
  3. Par l'intermédiaire de la setType() méthode.
  4. (Si aucun des éléments ci-dessus ne s'applique, le comportement par défaut est d'utiliser une chaîne ou un booléen pour les cases à cocher).

Ce sont vos options, vous pouvez choisir n'importe laquelle des trois, mais je pense que la première est meilleure que la deuxième, qui est meilleure que la troisième.

Mise à jour : Vous le savez probablement déjà, mais si votre classe personnalisée est vraiment personnalisée, vous aurez également besoin d'un élément IConverter qui gère les conversions String<->Someclass : vous pouvez soit l'enregistrer avec l'application, soit surcharger la fonction getConverter(Class<?> clazz ) pour le renvoyer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X