Я пытаюсь создать обновляемый графический интерфейс, используя JSF 2.2 и PrimeFaces 4.0. Моя проблема в том, что модель обновляется, но не вид.
Вот моя примерная страница. У него есть только кнопка, которая должна заставить две панели поменять местами:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:p="http://primefaces.org/ui">
<h:head/>
<h:body>
<h:form>
<p:panelGrid id="grid">
<p:row>
<p:column id="slot1" style="width: 100px; height: 100px">
<p:panel id="panel1" binding="#{test.panel1}" style="width: 100px; height: 100px"/>
</p:column>
<p:column id="slot2" style="width: 100px; height: 100px">
<p:panel id="panel2" binding="#{test.panel2}" style="width: 100px; height: 100px"/>
</p:column>
</p:row>
</p:panelGrid>
<p:commandButton id="button2" value="Switch Panels">
<p:ajax listener="#{test.onSwitchPanels(event)}" update="grid"/>
</p:commandButton>
</h:form>
</h:body>
</html>
И класс Java:
@ManagedBean
@SessionScoped
public class Test {
Panel panel1 = new Panel();
Panel panel2 = new Panel();
public Test() {
panel1.setHeader("Panel 1");
panel2.setHeader("Panel 2");
}
public Panel getPanel1() {
return panel1;
}
public void setPanel1(Panel panel) {
this.panel1 = panel;
}
public Panel getPanel2() {
return panel2;
}
public void setPanel2(Panel panel) {
this.panel2 = panel;
}
public void onSwitchPanels(ActionEvent event) {
Panel tmp = panel1;
panel1 = panel2;
panel2 = tmp;
}
}
Отладка показывает мне, что геттеры и сеттеры вызываются после onSwitchPanels()
с правильными новыми значениями при нажатии кнопки. Но как я писал вид не обновляется. Это происходит только после ручного обновления страницы или следующего щелчка (который, конечно, возвращает модель в исходное состояние, но показывает переключенные панели). Я уже пробовал update="@form"
и update="slot1 slot2"
безуспешно...