В оригинальном наборе компонентов icefaces (ICE components) для создания всплывающих диалоговых окон использовался элемент ice:panelPopup. Как правило, его отображение управлялось атрибутами visible и rendered, задаваемыми в переменной управляемого бина. Например:
Код xhtml страницы
<ice:panelPopup visible="#{dialogWindow.opened}"
rendered="#{dialogWindow.opened}"
...>
Код управляемого бина
@ManagedBean(name="dialogWindow")
@SessionScoped
public class PopupBean {
private boolean opened = false;
public PopupBean() {
...
}
public boolean getOpened() {
return opened;
}
public void setOpened(boolean opened) {
this.opened = opened;
}
public void toggleOpened(ActionEvent event) {
opened = !opened;
}
С появлением набора компонентов ACE Components был представлен ace:dialog, реализующий этот функционал. Однако, попытка управлять его состоянием способом, описанным выше скорее всего ни к чему хорошему не приведет - окно может не закрываться, отображаться одно поверх другого в бесконечном цикле, или блокировать страницу после закрытия (если было запущено в модальном режиме).
Причина заключается в том, что управление этим элементом, в отличие от старого, рекомендуется осуществлять на стороне клиента при помощи вызова JavaScript методов.
Код xhtml страницы:
<ace:dialog id="dialog"
header="..."
widgetVar="popupDialog"
closable="true"
modal="true"
draggable="false"
showEffect="clip"
hideEffect="fade"
width="400">
...
</ace:dialog>
<h:commandButton onclick="popupDialog.show();"/> <!-- показать окно -->
<h:commandButton onclick="popupDialog.hide();"/> <!-- скрыть окно -->
Если закрытие окна не может инициироваться действием пользователя (например, окно используется для аплоада файлов на сервер и должно закрываться после завершения загрузки), то из управляемого бина можно вызвать JavaScript функцию на клиенте). Для этого достаточно одной строки:
JavaScriptRunner.runScript(FacesContext.getCurrentInstance(), "popupDialog.show();");