Reputation: 3368
I have the following code where two SelectOneMenus are displayed. The first menu has language as values and the second menu tells me to select either "one or two" in case of En as language and as "uno or duo" in case of spanish.
I also need to make sure if I had selected item "two" and if I now change language to "Sp" then "duo" has to be the selected item.
How can I do this? Here is what I have
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;
}
}
Upvotes: 0
Views: 590
Reputation: 11742
It's simple. You forgot to change current values of the second list (items
). Do it like
<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>
with the following action listener in 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;
}
}
This stated, you should manage your code, by removing @State...
annotatings of your @ManagedBean
(it is not an @EJB
) and handling selections better that in the example provided above (via an @EJB
, or have simple lists in a @SessionScoped
@ManagedBean
, etc.).
To keep the selected value of your item, just add some lines to your action listener code (assuming that index of an item in item lists is the same and that they are of the same size in both languages):
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;
}
}
Upvotes: 1