style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

JTable una hermosura

Ok... después de unos 4 años de estarme peleando con .NET (especíicamente con WPF) y de regresar a ver "que tanto había avanzado java" me reencuentro con jTable y me maravillo de lo bien que está estructurado.
Es cierto, tal vez no tiene una forma tan directa de poner un query de SQL directo como fuente de datos y que esta arme el dataset para mostrarlo, pero ESO es una aberración.
Si ustedes, como me imagino lo han hecho, han tenido la necesidad de reutilizar código y montarlo no sólo en diferentes programas o en diferentes accesos a datos y presentarlos habrán sentido, tenido o implorado por una programación modular por capas y que utilice completamente la independencia de datos entre la capa de presentación y la capa de obtención de resultado de datos (que prara fines prácticos llamaremos DAO).
jTable permite una independencia en todos sus componentes, manejar la presentación de los datos obtenidos mediante un jTableModel que puede ser el de omisión o uno personalizado, de igual manera cada celda puede,según el tipo de datos presentar un manejo distinto de la presentación de datos, como ejemplo sencillo pondremos un código sencillo de una clase ocupada por una tabla para presentar los datos en una celda de varias lineas y con un tooltip para mostrar el contenido completo (espero haberme explicado):
primero creamos la gui (eso lo damos por sentado y sugerimos en su caso usar NetBeans y su WYSIWYG para GUIs), a ese panel o ventana le asignamos un controlador (una clase independiente que maneje la lógica de comportamiento de la presentación (así tenemos nuestra cara final independiente del que la maneja -como un títere que se puede comportar de manera diferente con cada titiritero), lo que veremos entonces es código de ese controlador:

JTable res = ventanaControlar.getjTResultados();
        res.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        palabras = busqueda.getPalabra();
        res.getColumnModel().getColumn(0).setPreferredWidth(50);
        res.getColumnModel().getColumn(1).setPreferredWidth(200);
        res.getColumnModel().getColumn(2).setPreferredWidth(50);
        res.setDefaultRenderer(String.class,
                new MultiLineCellRenderer());

lo que estamos haciendo es decirle a nuestra tabla que ancho tendrá cada columna y decirle que si el dato que se pone es un String se utilizará nuestra clase para mostrarla:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.awt.Component;
import java.awt.Font;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.table.TableCellRenderer;

/**
 *
 * @author charly
 */

public class MultiLineCellRenderer extends JTextArea
implements TableCellRenderer{
    public MultiLineCellRenderer(){
        setLineWrap(true);
        setWrapStyleWord(true);
        setOpaque(true);
       
    }

    public static boolean BOLD;
    @Override
    public Component getTableCellRendererComponent(JTable jtable, Object value,
                                   boolean isSelected, boolean hasFocus,
                                   int row, int column) {
        if(isSelected){
            setForeground(jtable.getSelectionForeground());
            setBackground(jtable.getSelectionBackground());
        }else{
            setForeground(jtable.getForeground());
            setBackground(jtable.getBackground());
        }
       
        Font font = null;
        if(BOLD)
            font = new Font(jtable.getFont().getFontName(), Font.BOLD, jtable.getFont().getSize() );
        else
            font = jtable.getFont();
       
        setToolTipText((String)value);
        setFont(font);
       
        setText((String)value);
        if(hasFocus){
            setBorder(UIManager.getBorder("Table.focusCellHighLightBroder"));
           
        }else{
            setBorder(new EmptyBorder(0,0,0,0));
        }
       
        return this;
    }
   
}

Espero que el código sea autoexplicable, pero en dado caso lo que estamos haciendo es decir que cuando tengamos un String mostraremos un JTextArea, este debe implementar, para poder ser un CellRenderer, la interfaz TableCellRenderer con la cual el JTextArea incorpora los valores que le den a la celda y los "pinta", así de esta manera podemos, como en este caso, manipular si pondremos el resultado en negritas o no, de igual manera podríamos decirle que el contenido (p.e.) es html y poner texto en diferentes colores o muchas cosas más con independencia completa del resto del comportamiento de la tabla.

Así pues es como JTable va utilizando un paradigma importantísimo de cualquier problema de sistemas: divide y vencerás, convirtiendo cada uno de los problemas de presentación de una tabla de datos en una solución completamente separados y con una solución por omisión que puede ser completamente reemplazable.

ya tendremos más oportunidades para seguir hablando de como ir personalizando nuestras tablas de resultados via JTable.
Saludos

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Que padré ( y raro ) que te

Que padré ( y raro ) que te guste el JTable. El problema ( güeno, ya sé que tengo que decir MI problame ) con Swing, es que tiene muchos niveles de abstracción y es difícil saber si estás muy arriba, muy abajo o estás de cabeza, pero como bien mencionas toda esa flexibilidad da frutos cuando se sabe lo que se hace.

El modelo de notificación que sigue es el de "Algo cambió, buscale" que a veces también da algunos problemas, pero al final y después de un rato de andarle moviendo encuentras que puedes hacer cosas muy muy interesantes.

Por cierto, un framework que le dá muchísimas opciones a los grids ( tables, y demás ) son los componentes de JIDE Soft. Si te gusta JTable échale un ojo a esos ( hay algunos que son open source ) a ver que te parecen:

http://www.jidesoft.com/

Ejemplo:

Imagen de charlymex

jidesoftware

jajjajajjajjajajaj... lo primero que me gustó fue el letrerito de "yes, we are hiring! "...:D
Lo de los niveles de abstracción se que suelen ser molestos, pero puede ser más (mucho más) molesto la falta de ellos, una de las peores cosas en tu vida es encontrarte con el "antipatrón" de "código spaguetti", ahora bien, por lo general es bueno aplicar la bien conocida frase "ni tanto que queme al santo ni tanto que no lo alumbre"... Saludos

Imagen de rugi

Para mí, despues de JTree;

Para mí, despues de JTree; JTable es uno de los comṕonentes más complejos dentro de Swing.
Pero, esa complejidad puede derivar en gran flexibilidad :)

El secreto está en aprender a darle un nivel de abstracción justo al modelo de datos..

Aqui un artículo que escribí ya hace varios años, pero que, explica a detalle esto con un ejemplo sencillo
http://www.javahispano.org/contenidos.item.action?id=1068&menuId=ARTICLES

Tomado de un mítico libro del 2002 llamado "La biblia de Swing" :)

Happy Swing!!
Saludos!!!

vaaaaaaaya vayaa.. que bien

vaaaaaaaya vayaa.. que bien que te dignas a dejarnos un par de líneas mi querido rugi ( oh ya lo habias hecho ? ) .. Yo al JTree siempre le he dado la vuelta.. :P pero ofortunadamente nunca he "tenido" que hacerlo.

Saludos.

Imagen de rugi

Jejejej.... pues, he andado

Jejejej.... pues, he andado algo desaparecido, pero.... hay que hacer presencia cada que se pueda ;)

Swing siempre me ha gustado, quizà se deba a que, precisamente, conocì java por Swing (le llamaban JFC) .... eran otroshhh tiemposshhhh!!!

Saludos!!!
---
RuGI

Imagen de charlymex

uuuuuuuuuuuuuuyyyyyyy.....

Me acuerdo perfectamente.... en eshosh tiemposh uno hachia lash coshash con AWT y todavia existia algo llamado Netscape... que fueron los que shacaron JFC...
Así es... El JTree comparado con el TreeView no es complejo, efectivamente igual que JTable puede ser muy flexible por que tiene muchas formas de hacerlo mostrar... prometo esta misma semana hablar un poco de el...:D
Saludos

Imagen de eguerra

Ayuda

Soy Principiante en desarrollo en Java y lo que estoy desrrollando es un aplicativo con base de datos, mi consulta es la sgte. e desarrollado una ventana que me permite importar datos de un archivo excel y lo que necesito es como comparar el ID que subo con la base de datos y me pinte la celda o celdas que no tiene ingresados el ID

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">