8

嗨,我想遍历人员对象列表并在每个人的选项卡中显示数据。我试过了:

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

这是行不通的。任何帮助表示赞赏

马塞尔

4

6 回答 6

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)时,执行后者并不是什么大问题。

于 2012-01-17T21:26:54.543 回答
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);
    }
}

希望它有所帮助,但现在我仍在寻找如何通过代码定义标签内容。

于 2011-01-18T09:08:17.400 回答
3

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


根据您的新问题进行更新:这确实是c:forEach. 您基本上必须自己指定输入 ID/名称并自己收集它们。另一种选择是在托管 bean 代码中以编程方式构建选项卡,或者在 PrimeFaces 上发布功能请求以添加<p:tabs>采用集合或数组的组件。

于 2010-10-30T05:23:22.677 回答
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组件的单个实例化。每次我想将一个组件添加到另一个组件时,我都必须创建一个新实例。

于 2011-12-30T14:22:00.833 回答
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 控制器中,您可以使用“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());

    }
于 2016-04-06T15:47:36.920 回答
0

编码

//通过代码生成标签

tabView = new TabView();

将在浏览器中产生错误:找不到属性;而不是使用 new 关键字,您必须使用:

FacesContext fc = FacesContext.getCurrentInstance();

内容标签视图 = (标签视图)

fc.getApplication().createComponent("org.primefaces.component.TabView");

HomeController 类也必须在 @RequestScoped 中

于 2011-09-08T07:43:01.387 回答