Actualizar table desde Window

hola gente tengo una pagina con un table al que le cargo por ejemplo personas y al darle click derecho sobre el elemento este es pasado a una windows en la cual permito al usuario modificar los datos de la persona, el usuario modifica guardo y todo pero al cerrar el windows el table oroginal de donde parti sigue teniendo los mismos datos, mi pregunta es la siguiente hay una forma de informarle “conversar” entre pantallas o tengo k implementar el patron observer???

Hola Gonzalo,

Lo más simple es pasarle una referencia de la tabla a la ventana y refrescar la tabla cuando proceda. No obstante, es una situación muy común, por lo que yo suelo utilizar la siguiente interfaz para implementar el patrón observer en los formularios de edición:

[code]
/**

  • Interface for model editors

  • @author Jose Luis Martin
    */
    public interface Editor extends PersistentServiceAware {

    /**

    • Add an editor listener to be notified on editor events
    • @param listener editor listener to add
      */
      void addEditorListener(EditorListener listener);

    /**

    • Remove a previusly added EditorListener
    • @param listener
      */
      void removeEditorListener(EditorListener listener);

    /**

    • Save model
      */
      void save();

    /**

    • Cancel edit
      */
      void cancel();

}
[/code]Por ejemplo, para editar un modelo al hacer doble click sobre una fila de una tabla uso el siguiente código donde se añade un EditorListener al diálogo de edición y la tabla se refresca si el editor ha cambiado el modelo.

/**
 * {@inheritDoc}
 */
 @SuppressWarnings("unchecked")
  public void itemClick(ItemClickEvent event) {
      if (event.isDoubleClick()) {
          VaadinView<T> editor = getEditorView();
          if (editor != null) {
              BeanItem<T> bi = (BeanItem<T>) event.getItem();
              editor.setModel(bi.getBean());
              editor.refresh();
              
              editor.addEditorListener(new EditorListener() {
                  
                  public void modelChanged(EditorEvent e) {
                      refresh();
                  }
              });
              
              ViewDialog dlg =  this.guiFactory.newViewDialog(editor);
              dlg.init();
              dlg.center();
              this.getUI().addWindow(dlg);
           }
        }
    }

Atendiendo al “VAADIN DATA MODEL” si hacemos que la “fuente de datos” del formulario sea la misma que la de la fila de la tabla se debería refrescar inmediatamente.
Es decir, puedes pasar al formulario de la ventana el ITEM que corresponde a su fila en la tabla.
Recuerda tener tabla.setImmediate(true) y así entiendo que cualquier cambio que hagas desde el formulario se debería refrescar inmediatamente en la tabla.

gracias jose luis y omar por responder, omar en cuanto a tu comentario estaria bueno ver un ejemplo pork no me logro dar cuenta como le pasaria la referencia del modelo desde una window a la pestania donde tengo el table.

Gonzalo, mira un ejemplo sencillo que he hecho para explicarte lo que te digo. Para entenderlo te ayudará el tema de 9 del
libro donde se explica el DATA MODEL en vaadin.

Supón que tenemos un clase Publicación

[font=courier new]
public class Publicacion {

private Integer id;
private String titulo;

}
[/font]

con sus setter’s y getter’s.

[font=courier new]
public class ItemAsDataSource extends UI {

// Fuente de datos del Table
BeanContainer<Integer, Publicacion> container = new BeanContainer<Integer, Publicacion>(Publicacion.class);

@Override
protected void init(VaadinRequest request) {
    
    // Fijamos la propiedad del BEAN que actúa como ITEM id
    container.setBeanIdProperty("id");
    
    cargaItems();
    
    final Table table = new Table();
    table.setContainerDataSource(container);
    table.setImmediate(true);
    table.setSizeFull();
    table.setSelectable(true);
    table.addValueChangeListener(new ValueChangeListener() {
        
        @Override
        public void valueChange(ValueChangeEvent event) {
            Integer itemId = (Integer)table.getValue();
            ItemAsDataSource.this.addWindow(new FormWindow(container.getItem(itemId)));
        }
    });
    
    this.setContent(table);
}

private void cargaItems() {
    for (int i = 0;i<10;i++) {
        container.addBean(new Publicacion(i,"Titulo " + i));
    }
}

}

class FormWindow extends Window {

private FieldGroup binder = new FieldGroup();

private TextField titulo = new TextField();
private NativeButton actualizarBt  = new NativeButton("ACTUALIZAR");;

private Item item;

public FormWindow(Item item) {
    
    this.item = item;

    this.setWidth(100.f, Unit.PERCENTAGE);
    this.setModal(true);

    actualizarBt.setSizeUndefined();
    actualizarBt.addClickListener(new ClickListener() {

        @Override
        public void buttonClick(ClickEvent event) {
            try {
                binder.commit();
            } catch (CommitException e) {
                Notification.show("CommitEx");
            }
        }
    });
    
    FormLayout fl = new FormLayout();
    fl.addComponent(titulo);
    fl.addComponent(actualizarBt);
    
    this.setContent(fl);
    
    binder.setItemDataSource(item);
    binder.bindMemberFields(this);
}

}
[/font]