使用PrimeFaces动态生成制表符

时间:2010-10-29 14:05:25

标签: java jsf primefaces

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

<p:tabView>
<ui:repeat ...>
   <p:tab title="#{expression}>
</ui:repeat>
</p:tabView>

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

马塞尔

6 个答案:

答案 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"


根据您的new problem with this

更新:这确实是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