0

I have an selectOneMenu and when Its value at 0, I want to "Add" button does not show up. I have rendered for this situation. Here is code ;

<p:panelGrid id="pnlRegister" columns="6" style="width: 95%" >
     <p:inputText id="name" class=" width100" value="#{register.name}" />

     <p:selectOneMenu id="numberOfChild" value="#{register.numberOfChild}" >
             <p:ajax listener="#{register.listenNumberOfChild()}" update="pnlRegister" />
             <f:selectItem itemValue="0" itemLabel="0" />
             <f:selectItem itemValue="1" itemLabel="1" />
             <f:selectItem itemValue="2" itemLabel="2" />
             <f:selectItem itemValue="3" itemLabel="3" />
             <f:selectItem itemValue="4" itemLabel="4" />
             <f:selectItem itemValue="5" itemLabel="5" />
     </p:selectOneMenu> 
     <p:commandButton id="addPerson" value="Add" actionListener="#{register.openPersonDialog(1)}" rendered="#{register.visibleAddPersonButton}"  >
             <p:ajax event="dialogReturn" update="pnlPerson" /> 
     </p:commandButton>

And Bean code;

public void listenNumberOfChild() {
    if (numberOfChild == 0) {
        visibleAddPersonButton = false;
    } else {
        visibleAddPersonButton = true;
    }       

    System.out.println("ListenerNumberOfChild " + numberOfChild);
}
</panelGrid>

Now problem is, when I change numberOfChild, listener works uptades pnlRegister as expected. However server does not keep inputText values. For example before listener works, I write register.name as "John". After listener works, it does not keep it and it gets as null. I hope I could tell what I'm trying and what is problem. So do you have any suggestion ? Also I tried RequestContext.getCurrentInstance().update but same problem occured.

  • I just tried its not working too – Bilal Ekrem Harmanşa Aug 13 '16 at 15:55
  • Why are you in first place trying to update the entire panel grid including all other inputs instead of only the button of interest? – BalusC Aug 13 '16 at 19:05
  • Actually I dont get your question clearly, sorry for my English :/ but if you ask this: There is a panel down there. It has a p:collector. Dialog contains some input components about personInfo. I add personInfo to personList and the collector creates from that list. I want that when dialog closed, the panel(down there) should be updated. Also if you look at it, button and selectOneMenu updates different panel and panelGrid. – Bilal Ekrem Harmanşa Aug 13 '16 at 19:47

1 Answers1

1

This is how I made it work:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://primefaces.org/ui">
<f:view>
    <h:head>
        <title>pfaces</title>
    </h:head>
    <h:form>
        <p:panelGrid id="pnlRegister" columns="3" style="width: 95%">
            <p:inputText id="name" value="#{register.name}"/>
            <p:selectOneMenu id="numberOfChild" value="#{register.numberOfChild}">
                <p:ajax process="name numberOfChild"
                        listener="#{register.listenNumberOfChild()}" update="pnlRegister"/>
                <f:selectItem itemValue="0" itemLabel="0"/>
                <f:selectItem itemValue="1" itemLabel="1"/>
                <f:selectItem itemValue="2" itemLabel="2"/>
            </p:selectOneMenu>
            <p:commandButton id="addPerson" value="Add"
                             rendered="#{register.visibleAddPersonButton}"/>
        </p:panelGrid>
    </h:form>
    <h:body>
    </h:body>
</f:view>
</html>

and the backing bean:

package biz.tugay.jsfexampla;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class Register {

    private boolean visibleAddPersonButton = false;
    private int numberOfChild = 0;

    private String name;

    public boolean isVisibleAddPersonButton() {
        return visibleAddPersonButton;
    }

    public void setVisibleAddPersonButton(boolean visibleAddPersonButton) {
        this.visibleAddPersonButton = visibleAddPersonButton;
    }

    public int getNumberOfChild() {
        return numberOfChild;
    }

    public void setNumberOfChild(int numberOfChild) {
        this.numberOfChild = numberOfChild;
    }

    public String getName() {
        return name;
    }

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

    public void listenNumberOfChild() {
        visibleAddPersonButton = numberOfChild != 0;
        System.out.println("ListenerNumberOfChild " + numberOfChild);
    }
}

Here, you can see it in action: https://youtu.be/IQN3HAejhcM

Koray Tugay
  • 20,438
  • 37
  • 155
  • 276