1

私は最初の jsf2 リッチフェイス アプリケーションを開発していますが、現在、次の問題に直面しています。

私は次のメニューを持っています

<rich:panelMenu >
            <rich:panelMenuGroup >
                 <rich:panelMenuItem label="Users" name="Users " />
                 <rich:panelMenuItem label="Orders" name="Orders"  />
            </rich:panelMenuGroup>

</rich:panelMenu>

panelMenuItem をクリックすると新しいタブが作成され、この新しいタブ内にアプリケーションのすべてのユーザーを含むテーブルを挿入する必要があります

このタイプの例をいくつか見ました

 <rich:tabPanel switchType="client" id="tabPanel">
    <c:forEach items="#{handlerTab.tabsName}" var="tabName">
        <rich:tab name = ... >

    </rich:tab>
</c:foreach>

しかし、新しいタブにテーブルを挿入するとわかりません

どのようにできるのか?


返信用のタンクですが、ビュー内のすべてのタブを宣言したくありません。タブを動的に追加および削除したいので、なんとかこれを行うことができました

 <rich:panelMenu >
 <rich:panelMenuGroup >
     <rich:panelMenuItem label="Users" name="Users"  action="#{tabsBean.createTabs()}" render="tabs" />
     <rich:panelMenuItem label="Orders" name="Orders"  action="#{tabsBean.createTabs()}" render="tabs" />
 </rich:panelMenuGroup>                

<h:panelGrid id="tabs" binding="#{tabsBean.panelGrid}"/>

次に、タブを管理するBeanがあります

@ManagedBean
@SessionScoped
public class TabsBean {

   private HtmlPanelGrid panelGrid;
   private Integer numOfTabs;

   @PostConstruct
   public void init(){numOfTabs=1;}


   public Integer getNumOfTabs() {
    return numOfTabs;
   }

   public void setNumOfTabs(Integer numOfTabs) {
    this.numOfTabs = numOfTabs;
   }

   public TabsBean() {
   }

   public HtmlPanelGrid getPanelGrid() {
    return panelGrid;
   }

   public void setPanelGrid(HtmlPanelGrid panelGrid) {
    this.panelGrid = panelGrid;
   }

   public void createTabs (){       


    FacesContext context = FacesContext.getCurrentInstance();
    Application application = context.getApplication();
    UITabPanel tabPanel = (UITabPanel)application.createComponent(UITabPanel.COMPONENT_TYPE);
    tabPanel.setSwitchType(SwitchType.ajax);

    for (int i=0; i<numOfTabs; i++){
        UITab tab = new UITab();
        tab = (UITab)application.createComponent(UITab.COMPONENT_TYPE);
        tab.setName("User Count "+i);
        tabPanel.getChildren().add(tab);

    }
    numOfTabs++;
    panelGrid.getChildren().clear();
    panelGrid.getChildren().add(tabPanel);
   }


}

今私の問題は、このタブにコンポーネントを追加する必要があることです(すべてのユーザーを含むデータテーブル、ユーザーを挿入するためのフォームなど)

どのようにできるのか?

4

2 に答える 2

3

メニューで特定のコンテンツを含むタブを開きたい場合は、タブを事前に作成して非表示にし、要求に応じて表示(レンダリング)することをお勧めします。作成するにUsersは、次のようにします。

クラスを作成しますUser(クラスがない場合)

public class User {     

    private String name;
    private String country;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }
}

UserTab管理対象Beanを作成する

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class UserTab implements Serializable {

    private List<User> users;
    private boolean rendered;

    public UserTab() {
        //Initialize list
        users = new ArrayList();

        //Initialize rendered attribute
        rendered = false;

        //Replace this for your User data retrieving method
        createDummyUsers();
    }

    private void createDummyUsers() {
        User user = new User();

        user.setName("John Doe");
        user.setCountry("USA");
        users.add(user);

        user = new User();
        user.setName("Bill Doe");
        user.setCountry("Canada");
        users.add(user);

        user = new User();
        user.setName("Winston Doe");
        user.setCountry("England");
        users.add(user);
    }

    public void showTab() {
        rendered = true;
    }

    public void hideTab() {
        rendered = false;
    }

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

    public boolean isRendered() {
        return rendered;
    }

    public void setRendered(boolean rendered) {
        this.rendered = rendered;
    }
}

タブハンドラーを作成します。

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class TabHandler implements Serializable {

    private String activeTab;

    public TabHandler() {
        activeTab = "none";
    }

    public String getActiveTab() {
        return activeTab;
    }

    public void setActiveTab(String activeTab) {
        this.activeTab = activeTab;
    }
}

ビューを作成する

<h:body>
        <h:form>
            <rich:panelMenu >
                <rich:panelMenuGroup >
                    <rich:panelMenuItem label="Users" name="Users" 
                                        actionListener="#{userTab.showTab()}">
                        <f:ajax event="select"
                                execute="@this"
                                render="tabPanel"
                                listener="#{tabHandler.setActiveTab('usersTab')}"/>
                    </rich:panelMenuItem>
                    <rich:panelMenuItem label="Orders" name="Orders"  />
                </rich:panelMenuGroup>
            </rich:panelMenu>


            <rich:tabPanel id="tabPanel"
                           switchType="client"
                           activeItem="#{tabHandler.activeTab}">

                <rich:tab id="mainTab">


                </rich:tab>

                <rich:tab id="usersTab"
                          rendered="#{userTab.rendered}">
                    <f:facet name="header">
                        <h:outputLabel value="Users"/>
                        <h:commandLink value="  X" actionListener="#{userTab.hideTab()}"/>
                    </f:facet>
                    <rich:dataTable value="#{userTab.users}"
                                    var="user">

                        <rich:column>
                            #{user.name}
                        </rich:column>

                        <rich:column>
                            #{user.country}
                        </rich:column>
                    </rich:dataTable>

                </rich:tab>

            </rich:tabPanel>
        </h:form>
    </h:body>

同じ手順を実行して、クラスに必要なタグを追加しますOrder

参照: RichFaces動的TabPanel

于 2013-01-24T12:12:22.487 に答える
2

c:forEachクリックしてタブを追加する場合は、オプションではありません。必要なのは、コンポーネントを動的に追加することです:

于 2013-01-24T09:19:07.843 に答える