使用PrimeFaces动态生成制表符

嗨,我想迭代一个person-object列表,并在每个人的标签中显示数据。 我试过了:

这不起作用。 任何帮助赞赏

马塞尔

PrimeFaces 3.x的tabView现在支持动态数量的选项卡,并添加了自己的迭代function:

    ... etc.   

不幸的是,仍然无法在同一个tabView中包含固定和动态标签(我想做),甚至无需重建视图即可动态添加标签。 幸运的是,使用SessionScoped或CDI ConversationScoped bean(或者也许是JSF ViewScoped bean)时,做后者并不是什么大问题。

我会将tabView绑定到服务器后端bean

   

 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内容。

p:tabView必须知道它的所有选项卡。 因此,您确实需要在视图构建时创建选项卡,而不是在视图渲染时创建选项卡。 所以使用c:forEach而不是ui:repeat 。 它已经包含在Facelets中,其默认的XML命名空间是xmlns:c="http://java.sun.com/jsp/jstl/core"


根据你的新问题 更新 :这确实是c:forEach的缺点。 您基本上必须自己指定输入ID /名称并自己收集它们。 另一种方法是以编程方式在托管bean代码中构建选项卡,或者在PrimeFaces上发布function请求以添加带有集合或数组的组件。

我有一个动态标签甚至内容有一个例外。 我无法使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" ...   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中生成许多选项卡

        

并且,在您的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();

ContentTabView =(TabView)

fc.getApplication()createComponent( “org.primefaces.component.TabView”);

HomeController类也必须在@RequestScoped中