Почему рендеринг не работает на панели

Как можно динамически показать или скрыть панель?

В приведенном ниже примере, когда я нажимаю btn-1, отображается panel-2, а panel-1 скрывается. Но когда я нажимаю btn-2, ничего не происходит.

Управляемый компонент

@ManagedBean
@ViewScoped
public class SampleController implements Serializable {
    private Boolean showPanel;

    public void button1() {
        showPanel = Boolean.FALSE;
    }

    public void button2() {
        showPanel = Boolean.TRUE;
    }

    public Boolean showPanel1(){
        return showPanel;
    }

    public Boolean showPanel2(){
        return ! showPanel;
    }
}

XHTML

<h:form id="form">
    <h:panelGroup id="container-panel-1">
          <h:panelGroup id="panel-1" rendered="#{sampleController.showPanel1()}">
              <p:commandButton id="btn-1"
                   actionListener="#{sampleController.button1}" 
                   update=":form:container-panel-1, :form:container-panel-2" />
          </h:panelGroup>
    </h:panelGroup>
    <h:panelGroup id="container-panel-2">
          <h:panelGroup id="panel-2" rendered="#{sampleController.showPanel2()}">
              <p:commandButton id="btn-2"
                   actionListener="#{sampleController.button2}" 
                   update=":form:container-panel-1, :form:container-panel-2" />
          </h:panelGroup>
    </h:panelGroup>
</h:form>

Я надеюсь, что вы можете помочь мне с этим.

Спасибо, Белл.


person bell    schedule 09.04.2015    source источник
comment
Данный код бросает NPE на showPanel2(). Как только вы исправите это, используя boolean вместо Boolean, у меня это сработает. Причина вашей проблемы не видна в предоставленной информации до сих пор. Мое лучшее предположение состоит в том, что вы импортировали @ViewScoped из неправильного пакета, в результате чего область действия управляемого компонента JSF по умолчанию была равна @RequestScoped, на что затем указывает пункт № 5 stackoverflow.com/questions/2118656/ будет применять.   -  person BalusC    schedule 09.04.2015
comment
Привет, BalusC, я меняю Boolean на boolean и проверяю, что пакет, который я использовал, был import javax.faces.bean.ViewScoped;. По-прежнему ничего не происходит, когда я нажимаю кнопку 2. Где вы увидели исключение? Я не вижу никаких исключений в своей консоли. Спасибо   -  person bell    schedule 11.04.2015
comment
Если вы не видите исключения и по-прежнему имеете описанную проблему, то у вас, вероятно, более серьезная проблема: серьезно испорченная среда разработки и/или проект. Я бы просто перезапустил с нуля.   -  person BalusC    schedule 13.04.2015


Ответы (1)


Этот код работает:

Вид:

<h:form id="form">

    <h:panelGroup id="container-panel-1">
        <h:panelGroup id="panel-1" rendered="#{sampleController.showPanel1()}">
            <p:commandButton id="btn-1" value="btn1"
               actionListener="#{sampleController.button1}" 
               update=":form:container-panel-1, :form:container-panel-2" />
        </h:panelGroup>
    </h:panelGroup>

    <h:panelGroup id="container-panel-2">
        <h:panelGroup id="panel-2" rendered="#{sampleController.showPanel2()}">
            <p:commandButton id="btn-2" value="btn2"
               actionListener="#{sampleController.button2}" 
               update=":form:container-panel-1, :form:container-panel-2" />
        </h:panelGroup>
    </h:panelGroup>
</h:form>

Бин:

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class SampleController implements Serializable {

    private boolean showPanel;

    public void button1() {
        showPanel = false;
    }

    public void button2() {
        showPanel = true;
    }

    public boolean showPanel1(){
        return showPanel;
    }

    public boolean showPanel2(){
        return ! showPanel;
    }
}
person 0x5a4d    schedule 12.04.2015