0

次のコードがあり、2つのSelectOneMenuが表示されています。最初のメニューには値として言語があり、2番目のメニューでは、言語としてEnの場合は「1つまたは2つ」を選択し、スペイン語の場合は「unoまたはduo」を選択するように指示されます。

また、アイテム「2」を選択したかどうかを確認する必要があります。言語を「Sp」に変更した場合は、「duo」を選択する必要があります。

これどうやってするの?これが私が持っているものです

index.html:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core">

    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
                           <h:form id="myForm">
                                    <h:panelGrid columns="4">
                                        <h:outputLabel value="Language:" />
                                        <h:selectOneMenu value="#{myBean.language}">
                                            <f:selectItems value="#{myBean.languages}" />
                                            <f:ajax listener="#{myBean.doUpdate}" render ="myForm" />
                                        </h:selectOneMenu>

                                        <h:outputLabel value="Items:" />
                                        <h:selectOneMenu value="#{myBean.item}">
                                            <f:selectItems value="#{myBean.items}" />
                                            <f:ajax listener="#{myBean.doUpdate}" render ="myForm" />
                                        </h:selectOneMenu>
                                         <h:panelGrid columns="1" id ="show" >
                                            <h:outputLabel value="#{myBean.language} #{myBean.item}"/>
                                        </h:panelGrid>

                                    </h:panelGrid>
                                </h:form>
    </h:body>
</html>

MyBean:

package bean;



import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.Stateful;
import javax.enterprise.context.RequestScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;



@ManagedBean(name = "myBean")
//@Stateless
@Stateful
@ViewScoped
public class MyBean implements Serializable{


    private List<String> languages;
    private String language;
    private String item;
    private List<String> items;

    public List<String> getItems() {
        return items;
    }

    public void setItems(List<String> items) {
        this.items = items;
    }


    /**
     * init() method for initializing the bean. Is called after constuction.
     */

    @PostConstruct
    private void init() {
    //public MyBean () {
        languages = getAllLanguages();
        language = "en"; //defaultLanguage 
        items = getItemsFromOverview();
    } 

    public String getItem() {
        return item;
    }

    public void setItem(String item) {
        this.item = item;
    }

    public List<String> getLanguages() {
        System.out.println("getLanguages, language " +language);
        return languages;
    }



    public String getLanguage() {
        System.out.println("getLanguage " +language);
        return language;
    }

    public void setLanguage(String language) {
        System.out.println("setLanguage " +language);
        this.language = language;
    }




    public List<String> getAllLanguages() {
        List<String> results = new ArrayList<String>();
        results.add("sp");
        results.add("en");

        if(results != null){
            System.out.println("getting all languages");
        }
        return results;
    }


    public void doUpdate() {

         System.out.println("doUpdate language " +language);
         System.out.println("doUpdate item " +item);

    }

    /**
     * Returns a list of all serialIDs present in the overview.
     * @return 
     */
    private List<String> getItemsFromOverview() {
        List<String> results = new ArrayList<String>();

        if(language.equalsIgnoreCase("en")){
            results.add("one");
            results.add("two");
        }
        else {
            results.add("uno");
            results.add("duo");

        }
                return results;
    }


}
4

1 に答える 1

1

それは簡単です。2 番目のリスト ( ) の現在の値を変更するのを忘れましたitems。好きにする

<h:form id="myForm">
    <h:selectOneMenu id="list1" value="#{myBean.language}" actionListener="#{myBean.updateFiledsInList2}">
        <f:selectItems value="#{myBean.languages}" />
        <f:ajax execute="@this" render ="list2 lang" />
    </h:selectOneMenu>
    <h:selectOneMenu id="list2" value="#{myBean.item}" >
        <f:selectItems value="#{myBean.items}" />
        <f:ajax execute="@this" render="item" />
    </h:selectOneMenu>
    <h:outputText id="lang" value="#{myBean.language}"/>
    <h:outputText id="item" value="#{myBean.item}"/>
</h:form>

MyBean で次のアクション リスナーを使用します。

public void updateFiledsInList2(ActionEvent event) {
    if(language.equals("en")) {
        items = new ArrayList<String>();
        items.add("one");
        items.add("two");
    } else if(language.equals("es")) {
        items = new ArrayList<String>();
        items.add("uno");
        items.add("dos");
    } else {
        items = null;
    }
}

これは、 ( ではない)@State...の注釈を削除し、上記の例よりも適切に選択を処理して ( を介して、または に単純なリストを含めるなど)、コードを管理する必要があることを示しています。@ManagedBean@EJB@EJB@SessionScoped @ManagedBean

アイテムの選択された値を保持するには、アクション リスナー コードにいくつかの行を追加するだけです (アイテム リスト内のアイテムのインデックスが同じであり、両方の言語で同じサイズであると仮定します)。

public void updateFiledsInList2(ActionEvent event) {
    int index = (item == null) ? -1 : items.indexOf(item);
    if(language.equals("en")) {
        items = new ArrayList<String>();
        items.add("one");
        items.add("two");
    } else if(language.equals("es")) {
        items = new ArrayList<String>();
        items.add("uno");
        items.add("dos");
    } else {
        items = null;
    }
    if(index >= 0) {
        item = (items == null) ? null : items.get(index);
    } else {
        item = null;
    }
}
于 2013-02-18T13:16:12.940 に答える