¿Cómo ubicar un JComboBox en una celda de un JTable?

Si acabas de llegar te invitamos a conocer nuestros tutoriales celdas no editables en un JTable y tamaño de columnas JTable. El día de hoy seguiremos con nuestros ejemplos previos y agregaremos un JComboBox a una celda de un JTable.

¿Cómo iniciamos?

Lo primero será crear un modelo de tabla, en el cual definiremos que tenemos 4 columnas de las cuales las tres (3) primeras no son editables:

package com.mm.swing.table.config;

import javax.swing.table.DefaultTableModel;

/**
 * Modelo de tabla propio.
 * @author mfmartinez
 */
public class MyOwnTableModel extends DefaultTableModel {
    
    /**
     * Define que solo la cuarta columna será editable.
     */
    private final boolean [] tableColums = {false, false, false, true};
    
    @Override
    public final boolean isCellEditable(int row, int column) {
        return this.tableColums[column];
    }
}

A continuación creamos un modelo de celdas, donde ajustamos el tamaño de las celdas y además a la cuarta celda agregamos un JComboBox, contenedor de una lista de sexos:

package com.mm.swing.table.config;

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableColumn;

/**
 * Modelo de las columnas.
 * @author ManuelFrancisco
 */
public class MyOwnColumnModel extends DefaultTableColumnModel {

    /**
     * Primera columna de la tabla.
     */
    private static final int COLUMN_NOMBRES = 0;
    /**
     * Segunda columna de la tabla.
     */
    private static final int COLUMN_PRIMER_APELLIDO = 1;
    /**
     * Tercera columna de la tabla.
     */
    private static final int COLUMN_SEGUNDO_APELLIDO = 2;
    /**
     * Cuarta columna de la tabla.
     */
    private static final int COLUMN_SEXO = 3;

    @Override
    public void addColumn(TableColumn tableColumn) {
        // Obtenemos el numero de la columna.
        switch (getColumnCount()) {
            case COLUMN_NOMBRES:
                tableColumn.setPreferredWidth(130);
                break;
            case COLUMN_PRIMER_APELLIDO:
                tableColumn.setPreferredWidth(100);
                break;
            case COLUMN_SEGUNDO_APELLIDO:
                tableColumn.setPreferredWidth(105);
                break;
            case COLUMN_SEXO:
                tableColumn.setPreferredWidth(80);
                tableColumn.setCellEditor(new DefaultCellEditor(getComboSexo()));
                break;
        }

        // Colocamos la columna NO ajustable.
        tableColumn.setResizable(false);
        // Agregamos la columna a la tabla.
        super.addColumn(tableColumn);
    }

    /**
     * Obtiene un combo sexo para una celda.
     * @return 
     */
    private JComboBox<String> getComboSexo() {
        JComboBox<String> comboSexo = new JComboBox<>();

        comboSexo.addItem("Hombre");
        comboSexo.addItem("Mujer");
        
        return comboSexo;
    }
}

Toda la magia se da gracias al método setCellEditor y la clase DefaultCellEditor, en conjunto son los encargados de renderizar el JComboBox en la tabla. A continuación creamos nuestra implementación de la tabla y agregamos ambos modelos:

package com.mm.swing.table;

import com.mm.swing.table.config.MyOwnColumnModel;
import com.mm.swing.table.config.MyOwnTableModel;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

/**
 * Clase que mostrara una tabla swing.
 * @author ManuelFrancisco
 */
public class MyOwnSwingTable extends JFrame {

    /**
     * Modelo de la tabla.
     */
    private final MyOwnTableModel tableModel = new MyOwnTableModel();
    /**
     * Modelo de las columnas.
     */
    private final MyOwnColumnModel columnModel = new MyOwnColumnModel();
    /**
     * Tabla a utilizar.
     */
    private final JTable table = new JTable();
    /**
     * ScrollPane el cual ser&aacute; el contenedor de la tabla.
     */
    private final JScrollPane scrollPane = new JScrollPane();

    /**
     * Constructor de la clase.
     */
    public MyOwnSwingTable() {
        // Layout null para ubicar el componente por coordenadas.
        this.setLayout(null);
        // Título de la ventana.
        this.setTitle("Mi Primera Tabla NO Editable");
        // Tamaño de la ventana.
        this.setSize(500, 500);
        
        // Configuramos como se mostrara la tabla.
        configurarTabla();
        // Agregamos el ScrollPane a la ventana.
        this.add(this.scrollPane);

        // Indicamos que la tabla no permite ajustar el tamaño.
        this.setResizable(false);
        // Indicamos que la aplicación finaliza al cerrar la ventana.
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        // Ubicamos la ventana en el centro de la pantalla.
        this.setLocationRelativeTo(null);
        // Mostramos la ventana.
        this.setVisible(true);

        // Agregamos filas a la tabla.
        agregarFilas();
    }

    /**
     * M&eacute;todo para agregar filas a la tabla.
     */
    private void agregarFilas() {
        this.tableModel.addRow(new Object[]{"Manuel", "Martinez", "Anillo"});
        this.tableModel.addRow(new Object[]{"Pedro", "Perez", "Puello"});
    }

    /**
     * M&eacute;todo en el cual se configuran aspectos de la tabla, como
     * tama&ntilde;o, ubicaci&oacute;n, columnas.
     */
    private void configurarTabla() {
        // Colocamos tamaño al ScrollPane.
        this.scrollPane.setSize(400, 400);
        // Agregamos el modelo de las columnas.
        this.table.setColumnModel(this.columnModel);

        // Agregamos las columnas al modelo de la tabla.
        tableModel.addColumn("Nombres");
        tableModel.addColumn("Primer Apellido");
        tableModel.addColumn("Segundo Apellido");
        tableModel.addColumn("Sexo");

        // Agregamos el modelo a la tabla.
        this.table.setModel(this.tableModel);
        // Agregamos la tabla al ScrollPane.
        this.scrollPane.setViewportView(this.table);
        // Indicamos donde se ubicará el ScrollPane y con que tamaño.
        // Parámetros: x, y, ancho, largo.
        this.scrollPane.setBounds(45, 40, 400, 400);
    }
}

Probando nuestra implementación

Para probar nuestra implementación, crearemos una clase Main encargada de la invocación de la tabla:

package com.mm.swing.main;

import com.mm.swing.table.MyOwnSwingTable;

/**
 * @author ManuelFrancisco
 */
public class Main {
 
    public static void main(String[] args) {
        new MyOwnSwingTable();
    }
}

Luego de ejecutar nuestra clase Main el resultado será el siguiente:

combo

Esto es todo por hoy, espero este tutorial haya sido de su agrado, nos vemos en una próxima entrada.

Suscríbete al blog por correo electrónico

Introduce tu correo electrónico para suscribirte a este blog y recibir notificaciones de nuevas entradas.

Deja un comentario