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

JSF Java Discussion :

[PrimeFaces] Totalisation dynamique


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut [PrimeFaces] Totalisation dynamique
    Bonjour à tous.
    J'ai un p:datatable éditable avec un total dans le ColumnGroup.
    Nom : testTotalisation.jpg
Affichages : 499
Taille : 5,6 Ko

    c'est une liste d'items
    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
    20
    21
    22
    23
    24
    25
    @ManagedBean
    @ViewScoped
    public class Item implements Serializable{
     
        public Item() {}
     
        public String getLibelle() {
            return libelle;
        }
     
        public void setLibelle(String libelle) {
            this.libelle = libelle;
        }
     
        public BigDecimal getMontant() {
            return montant;
        }
     
        public void setMontant(BigDecimal montant) {
            this.montant = montant;
        }
     
        private String libelle;
        private BigDecimal montant;
    }
    cette liste est pilotée par :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    @ManagedBean
    @ViewScoped
    public class ItemManager implements Serializable {
     
        public ItemManager() {
        }
     
        @PostConstruct
        public void initMethod() {
            items = new ArrayList<>();
            for (int i = 1; i <= 3; i++) {
                Item item = new Item();
                item.setLibelle("libellé n° " + i);
                item.setMontant(new BigDecimal(0)); // initialisation montant à zéro
                items.add(item);
            }
            totalMontant = "pas calculé";
        }
     
        public List<Item> getItems() {
            return items;
        }
     
        public String getTotalMontant() {
            return totalMontant;
        }
     
        public void setTotalMontant(String totalMontant) {
            this.totalMontant = totalMontant;
        }
     
        public void onCellEdit(CellEditEvent event) {
            BigDecimal total = new BigDecimal(0);
            for (Item item : items) {
                total = total.add(item.getMontant());
            }
            totalMontant = new DecimalFormat("#,##0.00").format(total);
            System.out.println("totalMontant calculé : " + totalMontant);
        }
     
        private List<Item> items;
        private String totalMontant;
    }
    Chaque fois que je change une valeur dans la colonne Montant, je voudrais que le total s'affiche en bas.

    J'ai donc fais un p:remoteCommand pour pouvoir mettre à jour le total :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p:remoteCommand name="refreshFooter" update=":monform:lignes:totalGroup"/>
    chaque fois qu'une cellule est modifiée, refreshFooter est appelé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p:ajax event="cellEdit"  listener="#{itemManager.onCellEdit}" oncomplete="refreshFooter();" />
    Au global mon xhtml est :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
        <h:body>
            <f:view>
                <h:form  id="monform">
     
                    <p:remoteCommand name="refreshFooter" update=":monform:lignes:totalGroup"/>
     
                    <p:dataTable id="lignes" var="item" value="#{itemManager.items}" editable="true"  editMode="cell"  style="width: 400px">
     
                        <p:ajax event="cellEdit"  listener="#{itemManager.onCellEdit}" oncomplete="refreshFooter();" />
     
                        <p:column headerText="Libellé" style="width: 70%">
                            <p:cellEditor >
                                <f:facet name="output"><h:outputText value="#{item.libelle}" /></f:facet>
                                <f:facet name="input"><p:inputText value="#{item.libelle}" /></f:facet>
                            </p:cellEditor>
                        </p:column>
     
                        <p:column headerText="Montant" style="width: 30%">
                            <p:cellEditor >
                                <f:facet name="output"><h:outputText value="#{item.montant}" /></f:facet>
                                <f:facet name="input"><p:inputText value="#{item.montant}" /></f:facet>
                            </p:cellEditor>
                        </p:column>
     
                        <p:columnGroup type="footer" id="totalGroup" >
                            <p:row >
                                <p:column footerText="totalisation"/>
                                <p:column footerText="#{itemManager.totalMontant}" />
                            </p:row>
                        </p:columnGroup>
     
                    </p:dataTable>
                </h:form>
            </f:view>
        </h:body>

    Mon problème :
    la méthode de totalisation est bien exécutée dans ItemManager
    (avec System.out.println("totalMontant calculé : " + totalMontant); j'obtiens bien Infos: totalMontant calculé : 123,00 dans le log)
    mais l'affichage ne se fait pas (en dépit du update=":monform:lignes:totalGroup")

    Le log me dit aussi :
    Avertissement: Can not update component "org.primefaces.component.columngroup.ColumnGroup" with id "monform:lignes:totalGroup" without a attached renderer. Expression ":monform:lignes:totalGroup" referenced from "monform:j_idt5"
    Du coup, quelqu'un saurait-il comment attacher un renderer à un ColumnGroup
    ou bien aurait une autre solution de contournement (genre un autre composant qui ferait le travail) ?
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  2. #2
    Membre émérite
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Par défaut
    Question bête : ca marche avec un footer "simple" mis dans la dernière colonne?

  3. #3
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    Qu'entends-tu par un "footer simple" ?
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  4. #4
    Membre émérite
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Par défaut
    Remplacer ton columngroup par un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <f:facet name="footer">
        Total #{itemManager.totalMontant}
    </f:facet>

  5. #5
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    Bien sûr, cela fonctionne ; mais dans ce cas je perds l'alignement des colonnes
    Dans le cas réel, j'ai une quinzaine de colonnes avec plusieurs totaux donc il faut que cela soit aligné.

    Une autre solution de contournement que j'utilise actuellement
    est de faire un second tableau de même dimension au pied du tableau principal.
    C'est pas terrible car il faut spécifier des largeurs de colonne en nombre de pixels et non plus en %
    Alors en cas de redimensionnement du navigateur, l'alignement merdouille.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  6. #6
    Membre émérite
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Par défaut
    Dans ce cas, met le f:facet directement a l'interieur de chaque colonne qui a besoin d'un total, ca restera forcément aligné ...

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

Discussions similaires

  1. [PrimeFaces] Calendrier dynamique
    Par ayasaidi dans le forum JSF
    Réponses: 14
    Dernier message: 31/01/2014, 20h45
  2. [PrimeFaces] Agenda dynamique
    Par ayasaidi dans le forum JSF
    Réponses: 11
    Dernier message: 24/01/2014, 16h26
  3. [PrimeFaces 3.2 / JSF 2] Identifiants dynamiques
    Par rolandl dans le forum JSF
    Réponses: 1
    Dernier message: 31/08/2012, 15h14
  4. Réponses: 4
    Dernier message: 25/06/2012, 14h13
  5. Paramètres Dynamique (Pie Chart : Primefaces 3.0)
    Par meryam123 dans le forum JSF
    Réponses: 5
    Dernier message: 08/02/2012, 18h29

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