Secciones

Artículos para tus primeros pasos

Si estás empezando a introducirte en el mundo de Groovy y Grails, no te pierdas nuestros artículos básicos: 

Entrevistas con los expertos
 

Los protagonistas te cuentan de qué van los proyectos más importantes del mundo Groovy:


Un proyecto de:
ImaginaWorks
Campus Escuela de Groovy

Groovy: primeros pasos

Como trabajar con table?

idecasso - jueves 03/07/2008

Estoy tratando de hacer lo siguiente, en una table mostrar una lista de archivos, los archivos estan en la siguiente clase:

class Archivo{

    File file

    boolean eliminar

}

 

Quiero  mostrarlos en la tabla y uso este codigo para esa parte:

scrollPane {
      table(id:'tbArchivos'){
           tableModel(list:lista) {
                propertyColumn(header:'Eliminar', propertyName:'eliminar')
                propertyColumn(header:'Archivo', propertyName:'file')
           }
     }
}

 Donde lista es la lista de archivos, bueno, el problema es que cuando muestra la columna eliminar, en lugar de mostrar un checbox, muestra una cadena, como hago que ponga el checkbox? ya cheque en los libros que tengo, y no mencionan como hacer eso, ni como se manejan los celleditor, si alguien sabe, le agradeceria enormemente, por que la verdad, en Java las JTable son un dolor de cabeza, funcionan muy bien pero hay que trabajar mucho. Gracias.

 

Re: Como trabajar con table?

idecasso - viernes 04/07/2008

Después de pensarlo mucho, me di cuenta que el problema era por falta un tablecellrender especifico, por que defaultcellrender soporta image, boolean y object, y como groovy solo usa objetos, me imagino que al invocar en donde uso boolean encuentra un Boolean y por eso muestra la cadena. Implemente la siguiente clase:

//Clase para renderizar los checkbox
class RenderCheckBox extends JPanel implements TableCellRenderer{
    private JCheckBox check = new JCheckBox()
   
    public RenderCheckBox(){
        this.setLayout(new BorderLayout())
        this.add(check,BorderLayout.CENTER)
    }

    public Component getTableCellRendererComponent(JTable tabla,
        Object valor, boolean seleccionado, boolean foco, int fila, int columna){
            check.setSelected(valor)
            /* El evento de pintar el foco de seleccion genera problemas,
                provocando cambios erraticos en el checkbox 

            if(foco){
                setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"))
               
            }else{
                setBorder(null)
            } */
           
            return this
    }
}

 

Que es casi como hacerlo en Java (de hecho solo faltan los ;). Luego antes de usar el swingbuilder, creo el objeto:

def checkBoxRender = new RenderCheckBox()

 y por ultimo la tabla queda asi:

scrollPane {
    table(id:'tbArchivos'){
        tableModel(list:lista) {
            propertyColumn(header:'Eliminar', propertyName:'eliminar', cellEditor: new DefaultCellEditor(checkBox()),
            cellRenderer: checkBoxRender)
            propertyColumn(header:'Archivo', propertyName:'file', editable:false,
            cellRenderer: render)
        }
    }
}

Quedo bien, solo dio problemas al pintar el foco, por eso esta desactivado en el RenderCheckBox. Mi preguta sería, alguien sabe como hacerlo de forma más sencilla? sin tener que implementar el TableCellRenderer? O alguna forma por defecto que asigne checkbox para los boolean? por que en java asi lo hace. La verdad la solución funciono pero me parece poco elegante. Gracias por su atención.

Responder al hilo | Volver al foro "Groovy: primeros pasos" | Volver a los foros