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 :

Ajout programmatiquement d'un dataTable, Chart, panel à un dashboard, primeFaces 4.0 ?


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 44
    Par défaut Ajout programmatiquement d'un dataTable, Chart, panel à un dashboard, primeFaces 4.0 ?
    Bonjour,
    ça fait un certain temps que j'essaye de créer programmatiquement sans succès, un dashboard, y ajouter des panels contenant du texte simple, un composant Chart, et enfin un un composant dataTable.
    Avec le Backing Bean suivant, j'arrive bien à créer le dashboard ainsi que les panels simples, mais le dataTable ne s'affiche pas.
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
     
    import java.io.Serializable;
    import java.util.List;
     
    import javax.annotation.PostConstruct;
    import javax.el.ELContext;
    import javax.el.ExpressionFactory;
    import javax.el.ValueExpression;
    import javax.faces.application.Application;
    import javax.faces.application.FacesMessage;
    import javax.faces.component.UIOutput;
    import javax.faces.component.html.HtmlOutputText;
    import javax.faces.context.FacesContext;
    import javax.faces.model.ArrayDataModel;
    import javax.faces.view.ViewScoped;
    import javax.inject.Inject;
    import javax.inject.Named;
     
    import org.apache.log4j.Logger;
    import org.primefaces.component.column.Column;
    import org.primefaces.component.dashboard.Dashboard;
    import org.primefaces.component.datatable.DataTable;
    import org.primefaces.component.panel.Panel;
    import org.primefaces.event.DashboardReorderEvent;
    import org.primefaces.model.DashboardColumn;
    import org.primefaces.model.DefaultDashboardModel;
     
    import fr.edf.sei.aggregator.dashboard.ejb.DashboardEJB;
    import fr.edf.sei.aggregator.dashboard.entities.Abonnement;
    import fr.edf.sei.aggregator.dashboard.entities.User;
    import fr.edf.sei.aggregator.dashboard.entities.UserPreferences;
     
    @Named
    @ViewScoped
    public class DashboardBacker implements Serializable {
    	@Inject
        private DashboardModelView dashboardModelView;
    	@Inject
    	private DashboardEJB dashboardEJB;
    	private Dashboard dashboard;
     
    	public DashboardBacker() {
    	}
     
    	@PostConstruct
    	public void init() {
    		logger.info("Creating model");
    		//String userId = "myId";
    		FacesContext fc = FacesContext.getCurrentInstance();
            Application application = fc.getApplication();
            String componentType = "org.primefaces.component.Dashboard";
            String rendredDashboardType = "org.primefaces.component.DashboardRenderer";
            dashboard = (Dashboard) application.createComponent(fc, componentType, rendredDashboardType);
            dashboard.setId("dynamic_dashboard");
            dashboard.setModel(dashboardModelView.getModel());
            System.out.println("passage ds init(), du dashBacker : "+dashboardModelView.getModel().getColumnCount());
            addChildren();
    	}
    	public void addChildren() {
    		System.out.println("passage dans addChildren(), avant clear() : "+dashboardModelView.getModel().getColumnCount());
    		dashboard.getChildren().clear();
    		System.out.println("passage dans addChildren(), après clear(): "+dashboardModelView.getModel().getColumnCount());
    			FacesContext fc = FacesContext.getCurrentInstance();
    			Application application = fc.getApplication();
    			String panelType = "org.primefaces.component.Panel";
    			String rendredPanelType = "org.primefaces.component.PanelRenderer";
     
    			List<DashboardColumn> columns = (List<DashboardColumn>) dashboardModelView.getModel().getColumns();
    			int index = 0;
    			for (Abonnement abonnement : dashboardModelView.getAbonnements()) {
    				Panel panel = (Panel) application.createComponent(fc,
    						panelType, rendredPanelType);
    				//Pour le test de dataTable : a enlever 
    				if(index == 6){
    					abonnement.setTypeAffichage(2);
    				}
    				if(abonnement.getTypeAffichage()==null){
    					panel.setId(abonnement.getPanelId());
    					panel.setHeader(abonnement.getIndicator().getLibelle());
    					panel.setClosable(true);
    					panel.setToggleable(true);
    					dashboard.getChildren().add(panel);				
    					DashboardColumn columnI = columns.get(index % columns.size());
    					columnI.addWidget(abonnement.getPanelId());
    					HtmlOutputText text = new HtmlOutputText();
    					text.setId("item"
    							+ Long.toString(abonnement.getIndicator()
    									.getIndicatorId()));
    					text.setValue(abonnement.getIndicator().getValeur() + "");
    					panel.getChildren().add(text);
    				}else if(abonnement.getTypeAffichage()==1){
    					/* type d'affichage Chart */
    					//TODO : createChart();
    				}else if(abonnement.getTypeAffichage() == 2){
    					/* dataTable*/
    					System.out.println("create dataTable"+abonnement.getTypeAffichage());
    					createDataTable(panel);
    				}			
    				index++;
    			}
    			System.out.println("passage après bcle d'ajout de panels: "+dashboardModelView.getModel().getColumnCount());
    			User user = dashboardModelView.getUser() ;
    			UserPreferences prefUser = user.getUserPreferences();
    			prefUser.setSerializableModel((DefaultDashboardModel) dashboardModelView.getModel());
    			prefUser.setClassName(dashboardModelView.getModel().getClass().getName());
     
    			user.setUserPreferences(prefUser);
    			dashboardEJB.updateUser(user);
    		}
     
    	private void createDataTable(Panel panel) {
    		FacesContext fc = FacesContext.getCurrentInstance();
            Application application = fc.getApplication();
    		ExpressionFactory ef = application.getExpressionFactory();
            ELContext elc = fc.getELContext();
     
            //Model
            String[][] rows = new String[][]{ { "1", "Foo" }, { "2", "Bar" },  {"3", "Baz" } };
            ArrayDataModel<String[]> model = new ArrayDataModel<String[]>( rows );
     
            //Table
            DataTable table = (DataTable) application.createComponent(DataTable.COMPONENT_TYPE);
            table.setValue(model);
            table.setVar("item");
            UIOutput tableTitle = (UIOutput)application.createComponent(UIOutput.COMPONENT_TYPE);
            tableTitle.setValue("Table Title");
            table.getFacets().put("header", tableTitle);
     
            //Index
            Column indexColumn = (Column) application.createComponent(Column.COMPONENT_TYPE);
            UIOutput indexColumnTitle = (UIOutput)application.createComponent(UIOutput.COMPONENT_TYPE);
            indexColumnTitle.setValue("Index");
            indexColumn.getFacets().put("header", indexColumnTitle);
    //      table.getColumns().add(column);
            table.getChildren().add( indexColumn );
     
            ValueExpression indexValueExp = ef.createValueExpression(elc, "#{item[0]}", Object.class);
            HtmlOutputText indexOutput = (HtmlOutputText)application.createComponent( HtmlOutputText.COMPONENT_TYPE );
            indexOutput.setValueExpression("value", indexValueExp);
            indexColumn.getChildren().add( indexOutput );  
     
            //Name Column
            Column nameColumn = (Column) application.createComponent(Column.COMPONENT_TYPE);
            UIOutput nameColumnTitle = (UIOutput)application.createComponent(UIOutput.COMPONENT_TYPE);
            nameColumnTitle.setValue("Name");
            nameColumn.getFacets().put("header", nameColumnTitle);
            table.getChildren().add( nameColumn );
     
            ValueExpression nameValueExp = ef.createValueExpression(elc, "#{item[1]}", Object.class);
            HtmlOutputText nameOutput = (HtmlOutputText)application.createComponent( HtmlOutputText.COMPONENT_TYPE );
            nameOutput.setValueExpression("value", nameValueExp);
            nameColumn.getChildren().add( nameOutput );    
     
            panel.getChildren().add(table);
     
    	}
    	private void addMessage(FacesMessage message) {
    		FacesContext.getCurrentInstance().addMessage(null, message);
    	}
     
    	public DashboardEJB getDashboardEJB() {
    		return dashboardEJB;
    	}
     
    	public void setDashboardEJB(DashboardEJB dashboardEJB) {
    		this.dashboardEJB = dashboardEJB;
    	}
     
     
    	public Dashboard getDashboard() {
    		//addChildren();
    		return dashboard;
    	}
     
    	public void setDashboard(Dashboard dashboard) {
    		this.dashboard = dashboard;
    	}
     
    	public DashboardModelView getDashboardModelView() {
    		return dashboardModelView;
    	}
     
    	public void setDashboardModelView(DashboardModelView dashboardModelView) {
    		this.dashboardModelView = dashboardModelView;
    	}
     
    	public DynamicDatatable getDynamicDatatable() {
    		return dynamicDatatable;
    	}
     
    	public void setDynamicDatatable(DynamicDatatable dynamicDatatable) {
    		this.dynamicDatatable = dynamicDatatable;
    	}
     
    }
    et voici la page xhtml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <p:dashboard id="dynamic_dashboard"	binding="#{dashboardBacker.dashboard}"  />
    Les panels sont créés en fonction du résultat d'une requête qui ramène les abonnements d'un utilisateur, du coup les exemples de manuel d'utilisateur ne répondent pas à mon besoin, vu qu'ils supposent que le nombre de panels est fixé d'avance.
    Est-il possible de faire ce travail sans créer programmatiquement le dashboard, les panels, le dataTable, et le Chart ? Si oui pourriez vous m'expliquer comment ?

    JSF 2.2
    Primefaces 4.0
    Glassfish 4/ WLS 12c
    En vous remerciant d'avance.

  2. #2
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    bonjour,

    La question est peut être idiote, mais pourquoi voulais tu faire ca par programmation ?
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 44
    Par défaut
    Citation Envoyé par Alkhan Voir le message
    bonjour,

    La question est peut être idiote, mais pourquoi voulais tu faire ca par programmation ?
    Salut,
    Le nombre de panels dans le dashboard dépends du nombre d'abonnements dont dispose l'utilisateur. Aussi le format de la présentation des données(dataTable, Chart, ou Panel simple) dépends des préférences utilisateur. pour l'instant ces préférences sont renseignées en dure dans le code mais à l'avenir l'utilisateur aura à choisir ses préférences dans une liste déroulante.
    Tous ces éléments me sont inconnus avant la connexion de l'utilisateur. Cette connexion va déclencher un processus ayant pour but de récupérer en base les abonnements ainsi que les préférences liés à cet utilisateur afin de peupler le dashboard selon les préférences de l'utilisateur en question.
    Je dois par la suite sauvegarder l'état du dashboard après chaque modification, et actuellement faute de trouver mieux je sérialize en base l'objet model du dashboard.

    J'ai passé énormément de temps à chercher une solution simple, hélas sans succès. J'ignore si mon besoin peut être réalisé autrement, et toutes les bonnes idées sont les bienvenues.

    Je vous remercie d'avance.

  4. #4
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    J'ai l'impression que tu prend le problème a l’envers !
    N'essaye pas de faire tout en même temps.
    moi je distingue deux choses :
    • Comment afficher les informations
    • Comment faire pour que l'utilisateur puisse personnaliser son affichage


    si tu essayes de faire les deux directement tu te créé des difficultés, la ou il n'y en a peut être pas !

    Quelles sont donc les premières infos a afficher ?
    Quelle est ta difficulté ?
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 44
    Par défaut
    J'ai l'impression que tu prend le problème a l’envers !
    C'est possible.

    N'essaye pas de faire tout en même temps.
    Dans un premier temps, je n'avais fait qu'afficher le dashboard de façon dynamique, et ça avait marché, en créant programmatiquement le dashboard ainsi que les panels simple contenant des simple String. Ensuite les choses se sont compliquées lorsque j'ai essayé de sauvegarder l'état du dashboard. J'ai fini par abandonner cette tache, trop compliqué !
    Dans un troisième temps, j'ai essayé d'afficher les données sous différentes formes(DataTAble, Charts...).

    si tu essayes de faire les deux directement tu te créé des difficultés, la ou il n'y en a peut être pas !
    T'as peut être raison, j'essaye de réaliser l'étape "Comment afficher les infos", d'une manière à ce que l'étape "Comment faire pour que l'utilisateur puisse personnaliser son affichage" soit réalisable.

    Quelles sont donc les premières infos a afficher ?
    Les premières infos à afficher sont des indicateurs, qui peuvent être affichés sous forme de :
    • Un échantillon(une seule valeur)
    • Un ensemble de valeur sur une plage (tableau de valeur)
    • Un ensemble de valeur avec des pourçentages (une Chart, des barres....)


    Quelle est ta difficulté ?
    Aujourd'hui j'arrive à faire ceci :
    • afficher un DataTable tout seul
    • une Valeur simple dans un Panel
    • afficher une Chart tout seul

    Par contre, ce que je n'arrive pas à faire c'est afficher dynamiquement dans le même dashboard les trois formes(Panel(s), DataTable, Chart(s) ) ?

    Merci pour ton aide précieux

  6. #6
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    Citation Envoyé par kelkan Voir le message
    Par contre, ce que je n'arrive pas à faire c'est afficher dynamiquement dans le même dashboard les trois formes(Panel(s), DataTable, Chart(s) ) ?
    Que veux tu dire par dynamiquement ? Avec les Jsf on fait pratiquement que ca !

    Pour moi, il n'y a pas vraiment de difficulté. dans la JSF tu créé un dashboard et dans chaque panel tu définis les infos qui sont a affichées !
    Évidemment, tu ne fais pas tous cela dans ton bean. Ton bean ne doit servir qu'a alimenter tes structures.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. ajouter un enregistrement à un datatable
    Par amen_1919 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 25/02/2009, 09h02
  2. Ajouter dynamiquement un composant dans un panel ou une popup
    Par ludogoal dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 21/04/2008, 16h08
  3. Ajout d'un graphique dans un panel ?
    Par denfer06 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 07/11/2007, 16h41
  4. Ajouter a la suite dans un panel contenu dans un scrollpane
    Par Darkcristal dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 16/08/2007, 17h14
  5. Ajouter un curseur personnalisé à un Control Panel
    Par nkd dans le forum Composants VCL
    Réponses: 2
    Dernier message: 18/10/2005, 23h25

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