Bonjour, j'essaye de créer dynamiquement des tab sur une tabView, je n'ai aucunes erreurs mon composant est bien créer par contre la vue ne se met à jour qu'après un rechargement de la page.
Voici mon code:
Génération du panel dans privateChatBean
Le XHTML qui appelle cette méthode:
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 public Panel getPanel() { logger.debug("panel privateChatBean " + this ); Application application = FacesContext.getCurrentInstance() .getApplication(); TabView tabView = (TabView) application .createComponent("org.primefaces.component.TabView"); FacesContext facesContext = FacesContext.getCurrentInstance(); FaceletContext faceletContext = (FaceletContext) FacesContext .getCurrentInstance().getAttributes() .get(FaceletContext.FACELET_CONTEXT_KEY); Set cles = session.getCalledUserList().keySet(); Iterator it = cles.iterator(); logger.debug("session size " + session.getCalledUserList().size() ); while (it.hasNext()){ String name = (String) it.next(); User userForComponent = (User) session.getCalledUserList().get(name); logger.debug("session parcours " + name ); CustomTab tab = new CustomTab(); tab.setTitle(userForComponent.getName()); tab.setId(name); tabView.getChildren().add(tab); logger.debug("session return " + tabView.getChildren().size() ); panel.getChildren().add(tabView); return panel; }
Mon customTab:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <p:commandButton value="Generate" reRender="tabs" ></p:commandButton> <p:panel binding="#{privateChatBean.panel}" id="tabs" rendered="true" style="height:500px"> </p:panel>
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 package org.zambaux.view.component; import java.io.IOException; import javax.faces.component.FacesComponent; import javax.faces.context.FacesContext; import javax.faces.view.facelets.FaceletContext; import org.primefaces.component.tabview.Tab; @FacesComponent(value="customTab") public class CustomTab extends Tab { public static final String COMPONENT_TYPE = "com.example.Include"; public static final String COMPONENT_FAMILY = "com.example.Output"; private enum PropertyKeys { src; } @Override public String getFamily() { return COMPONENT_FAMILY; } @Override public boolean getRendersChildren() { return true; } @Override public void encodeChildren(FacesContext context) throws IOException { getChildren().clear(); FaceletContext faceletContext = ((FaceletContext) context.getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY)); faceletContext.includeFacelet(this, "content/privateChatComponent.xhtml"); super.encodeChildren(context); } public String getSrc() { return (String) getStateHelper().eval(PropertyKeys.src); } public void setSrc(String src) { getStateHelper().put(PropertyKeys.src, src); } }
et le contenu privateCHatComponent.xhtml
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 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://primefaces.org/ui"> <h:form > <h:panelGrid columns="1" width="400"> <p:inputTextarea id="allMessages" rows="20" cols="50" value="#{privateChatComponentBean.allMessages}" ajax="false" autoResize="false" /> <h:panelGrid columns="2"> <p:inputTextarea id="yourMessage" value="#{privateChatComponentBean.yourMessage}" rows="5" cols="40"/> <p:commandButton action="#{privateChatComponentBean.sendMessage()}" update="allMessages,yourMessage" value="send"/> </h:panelGrid> </h:panelGrid> <p:poll update="allMessages" interval="50"></p:poll> </h:form> </html>
Je pensais que rerender suffisait pour mettre à jour mon panel mais apparemment non.
Merci beaucoup
Partager