Basuz
Basuz

Reputation: 171

Rendered is not working properly on JSF

My class is as follows:

public class TestBean implements Serializable{
private int id;
private String name;
private boolean showOut;
public TestBean(){
    showOut=false;
}
public void submit(){
    System.out.println("id-----"+id);
}
public void whatsTheName(AjaxBehaviorEvent e){
    System.out.println("listener called");
    if(id==0){
        name="Dog";
        showOut=true;
    }

    else if(id==1)
        name="Cat";
    else
        name="Bird";

}
public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    System.out.println("name called-----"+name);        
    return name;
}

public void setName(String name) {
    this.name = name;
}
public boolean isShowOut() {
    System.out.println("showOut called----"+showOut);
    return showOut;
}
public void setShowOut(boolean showOut) {
    this.showOut = showOut;
}
}

and xhtml is :

<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
</h:head>
<h:body>
 <h:form id="frm1">
    <h:selectOneMenu value="#{testBean.id}">
        <f:selectItem itemLabel="Dog" itemValue="0"></f:selectItem>
        <f:selectItem itemLabel="Cat" itemValue="1"></f:selectItem>
        <f:selectItem itemLabel="Bird" itemValue="2"></f:selectItem>
        <f:ajax execute="@form" event="change" 
        listener="#{testBean.whatsTheName}" render=":frm2:out"></f:ajax>
    </h:selectOneMenu>      
</h:form>
<br></br>
<br></br>
<h:form id="frm2">
    <h:outputText id="out" value="#{testBean.name}" rendered="#{testBean.showOut}"/>            
</h:form>

I want to show the Output box only when 'Dog' is selected. But rendered on outputText is not working even though the value of the particular variable is set properly on the backing bean.

Upvotes: 0

Views: 874

Answers (2)

ChristophS
ChristophS

Reputation: 623

As suggested by wittakarn, modify the render attribute and your outputText is rendered correctly.

But it will never disapper, because you never set showOut to false if a new selection is different to "Dog".

My suggestion is to change the content von whatsTheName(...) like so:

public void whatsTheName(AjaxBehaviorEvent e) {
    System.out.println("listener called");
    // change showOut in any case
    showOut = (id == 0);
    // apply text accordingly to the selected id
    switch (id) {
    case 0:
        name = "Dog";
        break;
    case 1:
        name = "Cat";
        break;
    case 2:
        name = "Bird";
        break;
    }
}

Upvotes: 0

wittakarn
wittakarn

Reputation: 3164

You can fix by rendering entire frm2 render=":frm2".

Upvotes: 1

Related Questions