Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Java / Agregar tablas a los items de un JComboBox

Agregar tablas a los items de un JComboBox

Autor jc mouse lunes, junio 25, 2018

En este post personalizaremos un componente JComboBox para que sus elementos acepten tablas (JTable) en lugar de texto simple.

Necesitamos:

  • Java 1.8 o superior
  • IDE de tu preferencia
  • Librerías: Ninguna

Tiempo 15 minutos

Nivel: Intermedio

Proyecto ComboTabla

Paso 1. Creamos un proyecto con nuestro IDE favorito con la siguiente estructura:

jtable java

Paso 2. Cada elemento del JComboBox esta formado por una tabla y un titulo de tabla, para esto debemos crear nuestro propio componente (ItemCombo.java) de la siguiente manera:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
/**
 * @see https://www.jc-mouse.net/
 * @author Mouse
 */
public class ItemCombo extends JPanel {    
    
    private JTable tabla;
    private JLabel tablaNombre;

    /**
     * Constructor de clase
     */
    public ItemCombo() {
        super();
        init();
    }
    
    private void init() {
        tabla = new JTable();
        tablaNombre = new JLabel();
        //dimensiones del componente
        setPreferredSize(new Dimension(300, 100));

        JScrollPane scroll = new JScrollPane();
        scroll.setViewportView(tabla);
        //para el titulo
        JPanel jPanel1 = new JPanel();
        jPanel1.setBackground(new Color(0, 0, 200));
        jPanel1.setPreferredSize(new Dimension(0, 16));
        jPanel1.setLayout(new GridBagLayout());
        //color de texto
        tablaNombre.setForeground(new Color(255, 255, 255));
        jPanel1.add(tablaNombre);
        //layout para el componente
        setLayout(new BorderLayout());
        
        //se agregan los componentes titulo y tabla
        add(jPanel1, BorderLayout.NORTH);
        add(scroll, BorderLayout.CENTER);        
    }        
        
    public String getNombreTabla() {
        return tablaNombre.getText();
    }

    public void setNombreTabla(String nombreTabla) {        
        tablaNombre.setText(nombreTabla);
    }

    public DefaultTableModel getTablaModel() {
        return (DefaultTableModel) tabla.getModel();
    }

    public void setTablaModel(DefaultTableModel tablaModel) {        
        this.tabla.setModel(tablaModel);
    }
    
}

paso 3. Ahora debemos indicar al JComboBox como renderizar cada elemento de la lista, para ello en la clase ItemComboRenderer.java añadimos el siguiente código:

import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
/**
 * @see https://www.jc-mouse.net/
 * @author Mouse
 */
public class ItemComboRenderer extends ItemCombo implements ListCellRenderer{
    
    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, 
            boolean isSelected, boolean cellHasFocus)
    {
        if (value != null) {//existe elemento
            
            setTablaModel(((ItemCombo) value).getTablaModel());
            setNombreTabla(((ItemCombo) value).getNombreTabla());            
            
            //Si elemento esta seleccionado no mostrara la tabla
            //sino solo el nombre de la tabla
            if (index == -1) {
                JLabel label = new JLabel(getNombreTabla());
                return label;
            }
            //sino muestra la tabla completa
            return this;
        } else {//se muestra un label vacio
            JLabel label = new JLabel();
            return label;
        }
    }
    
}

Paso 4. La Interfaz de Usuario

Abrimos nuestro formulario JFrame en modo diseño y le agregamos un JComboBox con dimensiones de 320×30

interfaz de usuario

Paso 5. 

Abrimos en modo codigo el JFrame y nos ubicamos en el constructor de clase, declaramos un DefaultComboBoxModel para los datos del combobox

//Model para el ComboBox
DefaultComboBoxModel model = new DefaultComboBoxModel();

A continuación, agregamos un primer elemento de la siguiente manera, creamos una nueva instancia de nuestro componente ItemCombo, le agregamos un nombre de tabla y un DefaultTableModel para los datos de la tabla.

finalmente añadimos este item1 al model del combobox

/**
 * Item #1
 */
ItemCombo item1 = new ItemCombo();
item1.setNombreTabla("Tabla de Productos");
DefaultTableModel tablemodel1 = new DefaultTableModel(new Object[][]{
    {"Mesa de Roble", "100 Uds.", "200 $us."},
    {"Estante de Pino", "24 Uds.", "69 $us"},
    {"Cabecera de cama", "3 Uds.", "1.200 $us"}
},
new Object[]{"Nombre", "Cantidad", "Precio"});
item1.setTablaModel(tablemodel1);
model.addElement(item1);

 

El procedimiento para agregar más elementos es el mismo.

Paso 6.

Para terminar agregamos al combobox tanto el model como el renderer de la siguiente manera:

jComboBox1.setModel(model);
jComboBox1.setRenderer(new ItemComboRenderer());

El código completo de los pasos 5 y 6 es

        //Model para el ComboBox
        DefaultComboBoxModel model = new DefaultComboBoxModel();

        /**
         * Item #1
         */
        ItemCombo item1 = new ItemCombo();
        item1.setNombreTabla("Tabla de Productos");
        DefaultTableModel tablemodel1 = new DefaultTableModel(new Object[][]{
            {"Mesa de Roble", "100 Uds.", "200 $us."},
            {"Estante de Pino", "24 Uds.", "69 $us"},
            {"Cabecera de cama", "3 Uds.", "1.200 $us"}
        },
                new Object[]{"Nombre", "Cantidad", "Precio"});
        item1.setTablaModel(tablemodel1);
        model.addElement(item1);

        /**
         * Item #2
         */
        ItemCombo item2 = new ItemCombo();
        item2.setNombreTabla("Tabla de Servicios");
        DefaultTableModel tablemodel2 = new DefaultTableModel(new Object[][]{
            {"Medicina Interna", "09:00 a 12:00", "100 $us."},
            {"Nutrición", "14:00 a 18:00", "40 $us"},
            {"Traumatologia", "10:00 a 13:00", "77 $us"}
        },
                new Object[]{"Nombre", "Horario", "Consulta"});
        item2.setTablaModel(tablemodel2);
        model.addElement(item2);       
        
        jComboBox1.setModel(model);
        jComboBox1.setRenderer(new ItemComboRenderer());

presionamos F6 para ejecutar el proyecto y tenemos:

swing java8

Nota: las tablas de nuestro combo se ajustan tanto en el ancho como en el alto porque lo planeamos así. Cuando lo diseñamos debemos tener cuidado en planificar que y como queremos mostrar los datos en la tabla para evitar errores como este:

        /**
         * Item #3 
         */
        ItemCombo item3 = new ItemCombo();        
        item3.setNombreTabla("Tabla desfasada");
        DefaultTableModel tablemodel3 = new DefaultTableModel(new Object[][]{
            {"A 1", "B 1", "C 1", "D 1" ,"E 1" ,"F 1","G 1" ,"H 1"},
            {"A 2", "B 2", "C 2", "D 2" ,"E 2" ,"F 2","G 2" ,"H 2"},
            {"A 3", "B 3", "C 3", "D 3" ,"E 3" ,"F 3","G 3" ,"H 3"},
            {"A 4", "B 4", "C 4", "D 4" ,"E 4" ,"F 4","G 4" ,"H 4"},
            {"A 5", "B 5", "C 5", "D 5" ,"E 5" ,"F 5","G 5" ,"H 5"},
        },
                new Object[]{"Col 1", "col 2", "Col 3", "Col 4" , "Col 5" ,"Col 6", "Col 7" ,"Col 8"});
        item3.setTablaModel(tablemodel3);
        model.addElement(item3);

donde:

bad gui wrong

enjoy!!!

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Juego de Tragamonedas o Tragaperras

Juego de Tragamonedas o Tragaperras

El juego de las tragamonedas o tragaperras es un juego muy popular de azar que se puede encontrar tanto en los casinos o...

Primeros pasos en Jaspersoft Studio

Primeros pasos en Jaspersoft Studio

¿Que es Jaspersoft Studio? Jaspersoft Studio es el nuevo diseñador de informes basado en Eclipse para JasperReports y Ja...

Lectura y edición de metadatos con ExifTool

Lectura y edición de metadatos con ExifTool

En este post te hablaremos sobre una interesante herramienta para le lectura y edición de metadatos que no te debe de fa...

Guardar reporte PDF directamente con Jasperreports

Guardar reporte PDF directamente con Jasperreports

Guardar un reporte PDF creado en iReport no es tan diferente de solo visualizarlo en pantalla. En este ejemplo se hace u...

Google Open Source: Código Abierto +2000 proyectos

Google Open Source: Código Abierto +2000 proyectos

Google abre las puertas de Google Open Source un nuevo sitio web que une todos sus proyectos de “Código Abierto...

Animaciones básicas con Pygame

Animaciones básicas con Pygame

En tutoriales pasados creábamos demasiadas líneas de código en el mismo lugar para dibujar en la pantalla, cosa que nos...

Comparte lo que sabes

Categorias

Últimas entradas

¿Que es el Ciberbullying? Ciberbullying es la unión de dos palabras en inglés cyber + bullying, en español lo conocemos...

Tradukisto es una biblioteca para Java 8 creada para convertir números enteros o cantidades de dinero a sus equivalentes...

Las aplicaciones con IA (Inteligencia Artificial) son cada vez más comunes y se encuentran en diferentes dispositivos de...

Tink es una biblioteca de cifrado desarrollada por un grupo de criptógrafos e ingenieros de seguridad de Google lanzado...

Android Bolivia

MAUS