嗨,我想遍历人员对象列表并在每个人的选项卡中显示数据。我试过了:
<p:tabView>
<ui:repeat ...>
<p:tab title="#{expression}>
</ui:repeat>
</p:tabView>
这是行不通的。任何帮助表示赞赏
马塞尔
嗨,我想遍历人员对象列表并在每个人的选项卡中显示数据。我试过了:
<p:tabView>
<ui:repeat ...>
<p:tab title="#{expression}>
</ui:repeat>
</p:tabView>
这是行不通的。任何帮助表示赞赏
马塞尔
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)时,执行后者并不是什么大问题。
我会将 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);
}
}
希望它有所帮助,但现在我仍在寻找如何通过代码定义标签内容。
p:tabView
必须知道它的所有选项卡。因此,您确实需要在视图构建期间创建选项卡,而不是在视图渲染期间。所以使用c:forEach
而不是ui:repeat
. 它已经包含在 Facelets 中,并且它的默认 XML 命名空间是xmlns:c="http://java.sun.com/jsp/jstl/core"
.
根据您的新问题进行更新:这确实是c:forEach
. 您基本上必须自己指定输入 ID/名称并自己收集它们。另一种选择是在托管 bean 代码中以编程方式构建选项卡,或者在 PrimeFaces 上发布功能请求以添加<p:tabs>
采用集合或数组的组件。
除了一个例外,我得到了动态选项卡甚至内容。我无法让 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组件的单个实例化。每次我想将一个组件添加到另一个组件时,我都必须创建一个新实例。
在 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 控制器中,您可以使用“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());
}
编码
//通过代码生成标签
tabView = new TabView();
将在浏览器中产生错误:找不到属性;而不是使用 new 关键字,您必须使用:
FacesContext fc = FacesContext.getCurrentInstance();
内容标签视图 = (标签视图)
fc.getApplication().createComponent("org.primefaces.component.TabView");
HomeController 类也必须在 @RequestScoped 中