您好 我想迭代一个person-object列表,并在每个人的标签中显示数据。我试过了:
<p:tabView>
<ui:repeat ...>
<p:tab title="#{expression}>
</ui:repeat>
</p:tabView>
这不起作用。任何帮助表示赞赏
马塞尔
答案 0 :(得分:17)
PrimeFaces 3.x的tabView现在支持动态数量的标签,并增加了自己的迭代功能:
<p:tabView value="#{myBean.tabList}" var="tabItem">
<p:tab title="#{tabItem.tabTitle}">
<h:outputText value="#{tabItem.valueA}"/>
... etc.
</p:tab>
</p:tabView>
不幸的是,仍然无法在同一个tabView中包含固定和动态标签(我想做),甚至无需重建视图即可动态添加标签。幸运的是,使用SessionScoped或CDI ConversationScoped bean(或者也许是JSF ViewScoped bean)时,做后者并不是什么大事。
答案 1 :(得分:4)
我将tabView绑定到服务器后端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);
}
}
希望它有所帮助,但现在我仍然在寻找如何通过代码定义Tab内容。
答案 2 :(得分:2)
p:tabView
必须了解其所有标签。因此,您确实需要在视图构建时创建选项卡,而不是在视图渲染时创建选项卡。因此,请使用c:forEach
代替ui:repeat
。它已包含在Facelets中,其默认XML名称空间为xmlns:c="http://java.sun.com/jsp/jstl/core"
。
更新:这确实是c:forEach
的劣势。您基本上必须自己指定输入ID /名称并自己收集它们。另一种方法是在托管bean代码中以编程方式构建选项卡,或在PrimeFaces上发布功能请求以添加带有集合或数组的<p:tabs>
组件。
答案 3 :(得分:1)
我有一个动态标签甚至内容都有一个例外。我无法使inputText.setLabel()工作。 .setValue()有效,但不是.setLabel()
以下是经过编辑的基本代码。我用了
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;
}
没关系,setLabel没有做我认为的事情。我以为它会为我自动生成一个标签。但我想我必须以其他方式添加标签。有什么建议吗?
我找到了!!!!
HtmlOutputLabel hol = new HtmlOutputLabel();
hol.setValue("label");
hol.setStyleClass("label");
tab.getChildren().add(hol);
在bean中执行此操作的全部原因再次是因为表单的动态特性和不同JSF标记的呈现生命周期。如果将选项卡视图绑定到辅助bean,那么在tabView的持续时间内,您将被卡在辅助bean中。如果你在tabview JSF声明中放入其他任何东西,它将不会呈现。除非我错过了什么?我无法使用ui:repeat标签来处理p:tab,我不能使用c:foreach标签。
此外,我无法重复使用primeface组件的单个实例。每次我想要将组件添加到另一个组件时,我都必须创建一个新实例。
答案 4 :(得分:1)
在Primefaces 5.X中 您应该使用它在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>
并且,在您的java控制器中,您可以使用&#34; event.getData()&#34;在更改选项卡中选择项目。 :
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());
}
答案 5 :(得分:0)
代码
//按代码生成标签
tabView = new TabView();
将在浏览器中产生错误:找不到属性; 而不是使用new关键字,您必须使用:
FacesContext fc = FacesContext.getCurrentInstance();
ContentTabView =(TabView)
fc.getApplication()createComponent( “org.primefaces.component.TabView”);
HomeController类也必须在@RequestScoped
中