IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NetBeans Java Discussion :

[Visual Web] Gestion des évenements par le ValueChangeListenerExpression


Sujet :

NetBeans Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 29
    Points : 29
    Points
    29
    Par défaut Gestion des évenements par le ValueChangeListenerExpression
    Dans un projet VisualWebApplication (NetBeans 5.5 + VWP), j'ai une page contenant des composants (TextField,DropDown...) crées dynamiquement à partir du backin bean de la page et ajoutés à un PanelLayout de cette même`page (Voir cette discussion pour plus de précisions)


    Maintenant, je souhaiterais créer une méthode déclenchée lors d'un evenement sur un composant DropDown crée dynamiquement.

    Dans le cas d'un composant "normal" j'ai l'habitue d'utiliser les fonctionnalités du VWP : click droit sur le composant puis " Auto-Submit on change" (VWP rajoute alors dans le tag JSP du composant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onChange="webuijsf.suntheme.common.timeoutSubmitForm(this.form, 'dropDown1');".
    Puis je double click sur le meme composant (VWP ajoute la propriete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valueChangeListenerExpression="#{Page1.dropDown1_processValueChange}"
    et cree dans le backing bean une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public void dropDown1_processValueChange(ValueChangeEvent event) {}
    Bien évidemment ces actions ne sont pas possibles sur un composant crée dynamiquement (car il n'est pas déclaré dans la page JSP).
    J'ai donc cherché à renseigner les parametres de mon composant de la maniere suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            DropDown dd = new DropDown();
            dd.setId("dd");
            dd.setOnChange("webuijsf.suntheme.common.timeoutSubmitForm(this.form, 'dd);");
     
            MethodExpression me = (MethodExpression)this.getApplication().getExpressionFactory().createMethodExpression(getFacesContext().getELContext(), "#{Page1.dd_processValueChange}", String.class,new Class[] {});
     
            dd.setValueChangeListenerExpression(me);        
            getLayoutPanel1().getChildren().add(0,dd);
    Et crée dans le backingbean la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        public void dd_processValueChange(ValueChangeEvent event) {
            System.out.println("VICTOIRE");
        }
    Le composant reagit bien à l'evenement en rechargant la page quand je change la valeur selectionnee
    Malheureusement, la victoire n'a jamais eu lieu ... et a la place j'ai eu le message de defaite suivant :

    AbortProcessingException thrown when processing event of type 'javax.faces.event.ValueChangeEvent' during phase 'PROCESS_VALIDATIONS 3' for component with ID or Client ID of 'dd'
    javax.faces.event.AbortProcessingException: Method not found: webapplication1.Page1@13acc3c.dd_processValueChange()


    Je dois reconnaitre que je manque de connaissances theoriques sur le sujet.
    Quelqu'un a-t-il une solution technique a mon probleme ? Sinon, pourrait-on m'eclairer sur le principe de fonctionnement de la gestion d'evenements avec la tchnolopgie JSF (A quel moment du cycle de vie de la requete interviennent les evenements, ou et comment peut-on les recuperer ...)


    Sinon, existe-t-il un autre moyen de récupérer la valeur de mon composant dropdown (en redefinissant une de ses methodes appellees lors de sa validation par exemple, mais comment faire??)

  2. #2
    Expert confirmé
    Avatar de Valère
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 334
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2005
    Messages : 1 334
    Points : 4 740
    Points
    4 740
    Par défaut
    Bonjour,

    Ci dessous un bout de code récupéré dans un de mes projets qui créée dynamiquement un composant ImageHyperlink et lui affecte une methode. Je pense que tu pourras t'en inspirer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
                        // creating image
                        ImageComponent image = new ImageComponent();
                        image.setId("image_" + name);
                        image.setUrl("ChartViewerBufferedImage?reference=" + name + "_" + timestamp.getTime());
     
                        // create the ImageHyperlink, add the already created ImageComponent
                        ImageHyperlink imageHyperlink = new ImageHyperlink();
                        imageHyperlink.getChildren().add(image);
                        imageHyperlink.setId("imageHyperlink_" + id);
     
                        // Add the binding to the action method: public String imageHyperlink1_action()
                        imageHyperlink.setAction(getApplication().createMethodBinding("#{Page1.imageHyperlink1_action}", null));
     
                        // Add the binding to the actionListener method: public void chartsActionListener(ActionEvent ae)
                        Class[] parameterList = { Class.forName("javax.faces.event.ActionEvent") };
                        imageHyperlink.setActionListener(getApplication().createMethodBinding("#{Page1.chartsActionListener}", parameterList));
     
                        // Add the ImageHyperlink to the GridPanel
                        gridPanel1.getChildren().add(imageHyperlink);
    Il faut que je pense à en faire un petit tuto.

    Si tu veux apprendre plein de petits trucs sur le VWP, je te suggère de t'abonner au RSS de www.planetnetbeans.org, et en particulier celui de Winston Prakash: http://blogs.sun.com/winston/. N'hésites pas à surfer dans les archives, pas mal de tips sur Creator 2 sont toujours d'actualité.

    Valère
    Pensez au bouton
    Je ne répond pas aux questions techniques par email ou MP.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 29
    Points : 29
    Points
    29
    Par défaut
    Merci, encore une fois Valere pour ton aide.

    Je me suis inspiré de ton petit exemple.
    Dans ma configuration (NetBeans5.5), la fonction createMethodBinding() etait marquée comme deprecated et il est preconisé d'utiliser getApplication().getExpressionFactory().createMethodExpression().

    Pour ceux qui veulent ee savoir un peu plus, voici un lien vers une page qui m'a aidé a compendre un peu mieux le "mapping" entre les composants et les methodes du backing bean ainsi que l'emploi et la signature de la fonction createMethodExpression() : http://blogs.sun.com/david/entry/net...l_web_pack_tip

    Dans mon cas (un composant DropDown) j'ai du adapter la solution proposée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            DropDown dd = new DropDown();
            dd.setId("dd");
          //  dd.setItems(getList().getOptions());        dd.setOnChange("webuijsf.suntheme.common.timeoutSubmitForm(this.form, 'dd');");
            ExpressionFactory expressionFactory = this.getApplication().getExpressionFactory();
            ELContext elContext = FacesContext.getCurrentInstance().getELContext();        
            MethodExpression listener = expressionFactory.createMethodExpression(elContext,
                    "#{Page1.ddvaluechange}",
                    null,
                    new Class[] {ValueChangeEvent.class});         
           dd.setValueChangeListenerExpression(listener);
            getLayoutPanel1().getChildren().add(0,dd);
    Ensuite, il ne reste plus qu'a creer dans le backingbean de votre page (dans mon cas: Page1) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        public void ddvaluechange(ValueChangeEvent event){
     
        }
    (et a implanter a votre guise...)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion des évenements lors de la validation par le bouton entrée
    Par rattlehead dans le forum Windows Forms
    Réponses: 2
    Dernier message: 26/12/2006, 16h24
  2. [TComPort] gestion des évenements
    Par akabane dans le forum Composants VCL
    Réponses: 2
    Dernier message: 10/05/2006, 10h29
  3. gestion des photos par formulaire
    Par jeck dans le forum IHM
    Réponses: 23
    Dernier message: 12/04/2006, 15h12
  4. [Installation] Gestion des droits par dossier ?
    Par Glob dans le forum CVS
    Réponses: 3
    Dernier message: 13/03/2006, 15h04
  5. [VB6] gestion des feuilles par des onglets
    Par kitsune dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 04/02/2006, 16h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo