Eventos en un Modal, invocar eventos de pantalla Principal

Saludos

Bueno tengo un modal del tipo Confirm ( Si o Cancelar) , el problema que tengo es que al invocar la opcion “SI” se tiene que actualizar un registro( no hay problema en eso), luego actualizar una lista y por ultimo cerrar el modal(no hay problema con el close). El actualizar la lista ya lo tengo configurado.
El problema es que no se como invocar la actualizacion de la lista desde el evento del window modal.
Una opcion que se me ocurrio es que al contruir el modal le envie la referencia de la clase del Form principal (que contiene el metodo para actualizar la lista), para poder invocar el evento refresh de la lista desde la referencia, pero no me parece muy elegante.
Estado viendo unos addons pero mi restriccion es que tiene que ser lo mas nativo posible con Vaadin 7.1.

Aqui les dejo fragmento del codigo



/CLASE PRINCIPAL QUE INVOCA AL MODAL/


public class
UsersView
extends
ViewUIVaadin
{

public [b]
UsersView
/b{

Button.ClickListener listenerButton=new Button.ClickListener(){
public void buttonClick(Button.ClickEvent event) {
if(event.getButton()==buttonEnabledUser){
Long pkUserSelect = Long.valueOf(usuario.getId());
if(usuario.getEnabled()== User.ENABLED) {
ConfirmDeleteUserView confirmDeleteUserView= new ConfirmDeleteUserView(“”, usuario,resourceBundleLabel);
getUI().getCurrent().addWindow(confirmDeleteUserView);


//METODO QUE DEBERIA INVOCARSE AL DARLE “SI” en el MODAL refreshListUsers();


if (userService.disabledUser(pkUserSelect)) {
refreshListUsers();
}else {
getUI().showNotification(“Ocurrio un error”);
}
}else{ if(userService.enabledUser(pkUserSelect)){
refreshListUsers();
}else{
getUI().showNotification(“Ocurrio un error”);
}
}
}
}
};
buttonEnabledUser.addClickListener(listenerButton);

}




/METODO QUE ACTUALIZA LA LISTA/



public void [b]
refreshListUsers
/b {
Container.Indexed c=table.getContainerDataSource();
c.removeAllItems();
table.setContainerDataSource(c);
List listaUsuarios = userService.getAllUsers();
for(int i=1;i<listaUsuarios.size();i++){
user = listaUsuarios.get(i);
buildOperationsColum(user);
table.addItem(new Object {horizontalLayoutRow, user.getLogin(), user.getName() , user.getLastName()}, i);
}
table.refreshRowCache();
table.requestRepaint();
table.setImmediate(true);
}

}




/MODAL CONFIRM/



public class
ConfirmDeleteUserView
extends
Window
{

void [b]
initialize
/b{

   Button.ClickListener listenerButton=new Button.ClickListener(){
            public void buttonClick(Button.ClickEvent event) {
                   if(event.getButton()==btnYes){
                          Long pkUser = Long.valueOf(user.getId());
                          isUserDisabled=true;
                          UsersView view=(UsersView)(getParent().getUI());
                          getUI().getCurrent().
                          closeView();
                         /[u]


/QUE DEBO AGREGAR PARA INVOCAR AL METODO refreshListUsers() de la clase UsersView

[/u]
}else{
closeView();
}
}
};
btnYes.addClickListener(listenerButton);
btnNo.addClickListener(listenerButton);

}
}

Hola Ronel,

Puede ser un poco tedioso crear una clase por cada diálogo de confirmación ya que normalmente sólo se necesita invocar un método en la clase desde la que se lanza el diálogo.

No se puede esperar a que el usuario pulse SI/NO en el servidor como se haria con un JOptionPane de Swing, de modo que parece que lo más sencillo es enviar un callback que maneje la elección del usuario al diálogo.

Yo normalmente uso un método estático para construir diálogos de confirmación:

FormUtils.showConfirmDialog(UI ui, final Command command, String msg) Donde Command es una una interfaz
puntero
con un único metódo
execute.

Para resolver el caso que expones, usaría algo como:

[code]
Command deleteCommand = new Command() {
public void execute() {
doDeleteUser();
}
};

FormUtils.showConfirmDialog(UI.getCurrent(), deleteCommand, msg);
[/code]Implementado el método de borrado
doDeleteUser
en la clase principal.

Saludos a todos

Bueno solo para comentarles que para solucionar mi tema cree un clase abstracta (ConfirmDialog.java) la cual contiene un metodo abstracto para implementar el la accion de los botones del dialog.

Aqui les dejo como quedo al final

/CLASE PRINCIPAL QUE INVOCA AL MODAL/
public class UsersView extends ViewUIVaadin {

public UsersView(){

Button.ClickListener listenerButton=new Button.ClickListener(){
public void buttonClick(Button.ClickEvent event) {
if(event.getButton()==buttonEnabledUser){
Long pkUserSelect = Long.valueOf(usuario.getId());
if(usuario.getEnabled()== User.ENABLED) {
String pregunta=“…”+ usuario.getFirstName()+" “+usuario.getLastName()+”…" ;
String titulo=“”;

ConfirmDeleteUserView confirmDeleteUserView= ConfirmDialogView(titulo,pregunta,400f,100f){
@Override
public void buttonClick(Button.ClickEvent event) {
if(event.getButton() == btnYes){
if(userService.disabledUser(pkUserSelect)){
refreshListUsers();
closeView();
}else{
closeView();
String mensajeError=resourceBundleLabel.getString(“security.exceptionondeleteuser”);
getUI().showNotification(mensajeError);
//getUI().showNotification(“Ocurrio un error, no se pudo DESHABILITAR al usuario”);
}
}else{
closeView();
}
};

getUI().getCurrent().addWindow(confirmDeleteUserView);
}else{ if(userService.enabledUser(pkUserSelect)){
refreshListUsers();
}else{
getUI().showNotification(“Ocurrio un error”);
}
}
}
}
};
buttonEnabledUser.addClickListener(listenerButton);

}

Bueno espero esto le sirva a alguien …

Con Java 8, otra alternativa para no tener que implementar una clase o interfaz por cada acción o evitar usar una clase particular (como Command), es usar
Consumer
s (o alguna otra
función
). Con
lambas
y "
method references
" el código puede resultar bastante más sencillo.