¿Cómo obtener el item seleccionado de una tabla?

Estoy empezando con Vaadin, aunque ya tengo mucho tiempo trabajando con programación desktop, por lo que algunos conceptos ya los conozco pero otros son nuevos o casi no los he manejado mucho.

Tengo un ejemplito que estoy trasteando para ir haciendo pruebas y conociendo Vaadin. Se carga una tabla de MySQL en una tabla Vaadin y se puede recorrer y seleccionar filas. Coloqué un label que me indica la clave primaria de la fila seleccionada. Hasta aquí todo bien, pero ahora quiero poder editar un en TextEdit un campo determinado de la fila seleccionada. Pero esto no he podido lograrlo.

Entiendo que la tabla tiene n items, los cuales tienen n properties y que a Texfield le puedo asignar un propertyDataSource, pero no se como lo obtengo:

aqui el código sencillo que tengo:

[code]
package com.example.prueba1;

import java.sql.SQLException;

import javax.servlet.annotation.WebServlet;

import com.hermes.containers.CasetasCont;
import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.data.Container;
import com.vaadin.data.Item;
import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.ObjectProperty;
import com.vaadin.data.util.sqlcontainer.SQLContainer;
import com.vaadin.data.util.sqlcontainer.connection.JDBCConnectionPool;
import com.vaadin.data.util.sqlcontainer.connection.SimpleJDBCConnectionPool;
import com.vaadin.data.util.sqlcontainer.query.TableQuery;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Label;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;

@SuppressWarnings(“serial”)
@Theme(“prueba1”)
public class Prueba1UI extends UI {

@WebServlet(value = "/*", asyncSupported = true)
@VaadinServletConfiguration(productionMode = false, ui = Prueba1UI.class)
public static class Servlet extends VaadinServlet {
}

@Override
protected void init(VaadinRequest request) {


        JDBCConnectionPool pool;
        try {
            pool = new SimpleJDBCConnectionPool(
                                          "com.mysql.jdbc.Driver",
                                          "jdbc:mysql:blablabla.bla.com",
                                          "root","pwd",2,5);
        
    
  SQLContainer contenedor = new CasetasCont(pool).GetDataSource();
    Table table =new Table("mi Tabla",contenedor  );
    Label label = new Label("Etiq");
    TextField nombre = new TextField("Nombre");
    
     table.setVisibleColumns(new Object[] {
                "nombre",
                "tramo" });
     table.setColumnHeaders(new String[] { "Nombre ", "Tramo" });
    table.setWidth("60%");
    table.setSelectable(true);
table.addValueChangeListener( new ValueChangeListener(){
    @SuppressWarnings("unchecked")
    public void valueChange(ValueChangeEvent event){

     label.setValue("Seleccionado:"+table.getValue());
     nombre.setPropertyDataSource(table.getItem(table.getValue()).getItemProperty(new Object[]{"nombre"}));
            
    }
});

[/code]Se agradece cualquier ayuda.

Hola.

Podría ayudar un resumen del “Vaadin data model”:

  • Property: Contiene sólo dos cosas, un valor y su tipo de dato.
  • Item: Colección de Properties. A cada Property se le asigna un Property ID (PID).
  • Container: Colección de Items. A cada Item se le asigna un Item ID (IID).

table.getValue() retorna el IID del Item seleccionado. Con este IID puedes obtener el Item completo del container respectivo (table o contenedor, en tu caso). Con el item y conociendo el PID, item.getItemProperty(PID) retornará el Property respectivo. Este Property lo puedes usar como data binding en cualquier componente que pueda ser enlazado (binded) a un Property (text fields, comoboxes, labels, etc.).

En tu caso particular, el problema es que estás llamando a getItemProperty(Object) usando un PID que no existe (un array).
Debes usar getItemProperty(“nombre”). Acá está el código “refactorizado”:

... public void valueChange(ValueChangeEvent event){ ... Object itemId = table.getValue(); Item item = table.getItem(itemId); Property property = item.getItemProperty("nombre"); nombre.setPropertyDataSource(property); } ... Espero te sirva.