java - welcome - Generar dinámicamente pestañas con PrimeFaces
primefaces themes (6)
El p:tabView
debe conocer todas sus pestañas. Por lo tanto, realmente necesita crear pestañas durante el tiempo de construcción de la vista, no durante el tiempo de visualización de la vista. Entonces use c:forEach
lugar de ui:repeat
. Ya está incluido en Facelets y su espacio de nombres XML predeterminado es xmlns:c="http://java.sun.com/jsp/jstl/core"
.
Actualice según su nuevo problema con esto : esa es una desventaja de c:forEach
. Básicamente tienes que especificar los ID / nombres de entrada tú mismo y reunirlos tú mismo. Otra alternativa es crear las pestañas programáticamente en el código de bean administrado, o publicar una solicitud de función en PrimeFaces para agregar un componente <p:tabs>
que tome una colección o matriz.
Hola, me gustaría repetir una lista de persona-objeto y mostrar los datos en una pestaña por persona. Lo intenté:
<p:tabView>
<ui:repeat ...>
<p:tab title="#{expression}>
</ui:repeat>
</p:tabView>
Esto no está funcionando. Cualquier ayuda apreciada
Marcel
El tabView de PrimeFaces 3.x ahora admite un número dinámico de pestañas con la adición de su propia característica de iteración:
<p:tabView value="#{myBean.tabList}" var="tabItem">
<p:tab title="#{tabItem.tabTitle}">
<h:outputText value="#{tabItem.valueA}"/>
... etc.
</p:tab>
</p:tabView>
Desafortunadamente, todavía no es posible incluir pestañas fijas y dinámicas en el mismo tabView (como quería hacer), o incluso agregar dinámicamente una pestaña sin reconstruir la vista. Afortunadamente, hacer esto último no es un gran problema cuando se usa un bean SessionScoped o CDI ConversationScoped (o quizás también un Bean JSF ViewScoped).
En Primefaces 5.X debe usar esto para generar muchas pestañas dentro de tabview
<p:tabView id="tabdinamico2" value="#{proyectoMb.beanList}" var="item" orientation="left" effect="fade" effectDuration="fast">
<p:ajax event="tabChange" listener="#{proyectoMb.loadCampoEquipo}" update="frmProyecto:tabProyecto:tabdinamico2"/>
<p:tab title="#{item.nombre}">
<h:outputText value= "#{item.id}"/>
<h:outputText value= "#{item.nombre}"/>
</p:tab>
</p:tabView>
y, en su controlador java, obtiene el elemento seleccionado en la pestaña changetab con "event.getData ()":
public void loadCampoEquipo(TabChangeEvent event) {
System.out.println("loadCampoEquipo");
System.out.println("tab1:" + event.getTab().getId());
System.out.println("tab2: " + event.getData());
System.out.println("tab3:" + event.getSource().toString());
System.out.println("tab4: " + event.getTab().getTitle());
System.out.println("tab5: " + event.getTab().getTitletip());
}
Me gustaría vincular el tabView al servidor back bean
<p:tabView binding="#{homeController.tabView}">
</p:tabView>
public class HomeController {
private TabView tabView;
public TabView getTabView(){
return tabView;
}
public void setTabView(TabView tabView){
this.tabView = tabView;
}
public HomeController(){
//generate tabs by code
tabView = new TabView();
Tab tab1 = new Tab();
tab1.setTitle("Business Partner");
Tab tab2 = new Tab();
tab2.setTitle("Manage Favorites");
tabView.getChildren().add(tab1);
tabView.getChildren().add(tab2);
}
}
Espero que ayude, pero ahora todavía estoy buscando cómo definir el contenido de la pestaña por código.
Obtuve pestañas dinámicas e incluso contenido con una excepción. No puedo hacer que inputText.setLabel () funcione. .setValue () funciona pero no .setLabel ()
Aquí está el código redactado y esencial. solía
XTML
...
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:csxc="http://java.sun.com/jsf/composite/csxcomponent"
xmlns:p="http://primefaces.prime.com.tr/ui"
...
<p:tabView rendered="true" style="width:500px;float:left;margin-top:10px;margin-left:5px;" binding="#{scenarioInputs.tabView }">
</p:tabView>
Java Bean
@ManagedBean(name = "scenarioInputs")
@RequestScoped
...
public TabView getTabView() {
FacesContext fc = FacesContext.getCurrentInstance();
tabView = (TabView) fc.getApplication().createComponent(
"org.primefaces.component.TabView");
String[] value = fc.getExternalContext().getRequestParameterValuesMap()
.get("cat");
int val = 0;
// error check the value to insure compatibility
if (value.length < 1 || value.length > 1) {
val = 0;
} else {
try {
val = Integer.parseInt(value[0]);
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
val = 0;
}
}
// get the sub category title
String[] temp = this.getSubCategories(val);
// dynamically create the tabs needed for this category
for (String sub : temp) {
Tab tab = new Tab();
tab.setTitle(sub);
Random randomGenerator = new Random();
int total = Math.max(1, randomGenerator.nextInt(6));
for (int i = 0; i < total; i++) {
InputText inputtext = new InputText();
// this method does not work, or if it does, it doesn''t do what
// I think it should do.
inputtext.setLabel("LabelYo");
// set the value of the text box
inputtext.setValue("value");
tab.getChildren().add(inputtext);
}
tabView.getChildren().add(tab);
}
return tabView;
}
No importa, setLabel no hace lo que creo que hace. Pensé que generaría automáticamente una etiqueta para mí. Pero creo que tengo que agregar una etiqueta de otra manera. ¿Alguna sugerencia?
¡¡¡¡Lo encontré!!!!
HtmlOutputLabel hol = new HtmlOutputLabel();
hol.setValue("label");
hol.setStyleClass("label");
tab.getChildren().add(hol);
Una vez más, la razón principal para hacer esto en un bean es la naturaleza dinámica de la forma y el ciclo de vida del renderizado de las diferentes etiquetas JSF. Si vincula una vista de pestaña a un bean de respaldo, entonces quedará atascado en el bean de respaldo durante todo el tabView. Si coloca NADA más en la declaración JSF de tabview, no se procesará. A menos que me haya perdido algo? No pude obtener el ui: repetir la etiqueta para que funcione con la pestaña p: y no tengo permiso para usar las etiquetas c: foreach.
Además, no pude reutilizar una sola instanciación de los componentes de la primata. Tuve que crear una nueva instancia cada vez que quería agregar un componente a otro componente.
el código
// genera pestañas por código
tabView = new TabView ();
producirá un error en el navegador: propiedad no encontrada; en lugar de usar palabras clave nuevas, debe usar:
FacesContext fc = FacesContext.getCurrentInstance ();
ContentTabView = (TabView)
fc.getApplication (). createComponent ("org.primefaces.component.TabView");
la clase HomeController también debe estar en @RequestScoped