Important Notice - Forums is archived
To simplify things and help our users to be more productive, we have archived the current forum and focus our efforts on helping developers on Stack Overflow. You can post new questions on Stack Overflow or join our Discord channel.

Vaadin lets you build secure, UX-first PWAs entirely in Java.
Free ebook & tutorial.
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 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) {
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 refreshListUsers() {
Container.Indexed c=table.getContainerDataSource();
c.removeAllItems();
table.setContainerDataSource(c);
List<User> 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 initialize(){
...
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();
//QUE DEBO AGREGAR PARA INVOCAR AL METODO refreshListUsers() de la clase UsersView
}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:
Command deleteCommand = new Command() {
public void execute() {
doDeleteUser();
}
};
FormUtils.showConfirmDialog(UI.getCurrent(), deleteCommand, msg);
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 Consumers (o alguna otra función). Con lambas y "method references" el código puede resultar bastante más sencillo.