Si necesitas un código de programación en específico, escríbeme al formulario de contacto.

BUSCA TU CÓDIGO


BUSCA MÁS CÓDIGOS DE PROGRAMACIÓN AQUÍ:

Código JAVA: Asignar Combo Box y Check Box a celdas de una JTable


Este post está orientado a la aplicación e implementación de un fragmento de código, que nos permitirá usar y/o agregar componentes como Combo Box y Check Box en las celdas de nuestra JTable:

Clase para renderizar y/o procesar las celdas de una JTable
import java.awt.Component;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;


public class Render implements TableCellRenderer{
  

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {


        DefaultTableModel model = (DefaultTableModel) table.getModel();

        JCheckBox check=new JCheckBox();
        JLabel lbl= new JLabel();
        JComboBox combo=new JComboBox();

        combo.addItem("Seleccione");
        combo.addItem("Femenino");
        combo.addItem("Masculino");


        if(model.getValueAt(row,column).getClass().equals(Boolean.class)){
          
            check.setSelected(Boolean.parseBoolean(model.getValueAt(row,column).toString()));
            return check;

        }

        if (column<5){

            lbl.setText(" "+model.getValueAt(row,column).toString());
            return lbl;

        }

        if(column==5){

            combo.setSelectedItem((model.getValueAt(row,column).toString()));
            return combo;

        }

   return lbl;


  }
    

}
              


Código para aplicar el renderizado
Render render = new Render();

JComboBox comboBox = new JComboBox();
JCheckBox checkBox = new JCheckBox();

comboBox.addItem("Seleccione");
comboBox.addItem("Femenino");
comboBox.addItem("Masculino");

DefaultCellEditor defaultCellEditor1=new DefaultCellEditor(comboBox);
DefaultCellEditor defaultCellEditor2=new DefaultCellEditor(checkBox);

tblDatos.getColumnModel().getColumn(5).setCellEditor(defaultCellEditor1);
tblDatos.getColumnModel().getColumn(6).setCellEditor(defaultCellEditor2);

       
tblDatos.setDefaultRenderer(tblDatos.getColumnClass(0), render);
                                               


Instrucciones y Recomendaciones 

1- Debes crear una clase JAVA, igual a la del código resaltado en azul.





2- En la primera parte de la Clase, lo que procedemos a realizar es, importar todas las librerías necesarias para que nuestro código funcione:
import java.awt.Component;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
3- Lo que hacemos a continuación, es crear la estructura de nuestra Clase, dándole un nombre "Render" con las características y/o propiedades de "public" y "class"; luego, usamos la línea o la palabra reservada "implements" la cual nos permitirá emplear la interface "TableCellRenderer" cuya utilidad radica en poder procesar las celdas de una JTable y proceder a su personalización. Por último, delimitamos nuestra Clase con las llaves "{}" que contendrán todo el código que ejecutará los procedimientos que deseamos. Teniendo en cuenta cada parte del código, esta línea quedaría de la siguiente forma:
public class Render implements TableCellRenderer{}
4- Dentro de la Clase creada en el punto anterior, implementaremos el método "getTableCellRendererComponent", el cual hace parte o pertenece a la interface "TableCellRenderer"; dicho método devolverá un objeto del tipo Component; es decir, un Combo Box, una casilla de verificación, un JLabel, etc.
Este método usa varios parámetros, como la JTable, el valor de una celda, entre otros, los cuales servirán para determinar o ejecutar las acciones pertinentes y así lograr el resultado esperado:

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {}
              
 
5- Seguidamente, dentro del método del punto anterior procedemos a crear un objeto de la Clase "DefaultTableModel", al cual llamaremos "model" en este capturaremos y/o guardaremos el modelo de nuestra JTable. Teniendo en cuenta todo lo anterior, esta línea quedaría de la siguiente manera:
DefaultTableModel model = (DefaultTableModel) table.getModel();
6- Luego de la línea del punto anterior, vamos a crear los componentes que queremos agregar a las celdas de nuestra tabla, en este caso designaremos 3 tipos de elementos: un JCheckBox al cual llamamos "check", un JLabel "lbl" y finalmente un JComboBox llamado "combo"; este último, lo procedemos a llenar o a asignarle los ítems que queremos que contenga, en este caso nuestro elemento servirá para elegir el sexo de una persona:
JCheckBox check=new JCheckBox();
JLabel lbl= new JLabel();
JComboBox combo=new JComboBox();

combo.addItem("Seleccione");
combo.addItem("Femenino");
combo.addItem("Masculino");
7- Luego de crear nuestros componentes y de llenar el Combo Box; ahora, usaremos varios condicionales "if", que nos permitirán definir el tipo de componente a asignar en una determinada celda de la JTable:

*En el primer condicional, procedemos a verificar si la Clase del valor de una determinada celda es del tipo "Boolean.class"; es decir, si dicho valor es "true" o "false", en el caso dado de que se cumpla la condición procedemos a usar nuestro JCheckBox "check" al cual le aplicamos el método "setSelected()" pasándole como parámetro el contenido de dicha celda, esto permitirá que nuestro componente aparezca seleccionado o no, luego de esto retornamos el CheckBox.

*En el segundo condicional, verificamos que la columna sea una comprendida del rango del 0 al 4; es decir, en palabras más claras usaremos la columna 0, la 1, la 2, la 3, y la 4 de nuestra JTable, una vez cumplida la condición, usamos nuestro componente JLabel "lbl" al cual le aplicamos el método "setText()" pasándole como parámetro el valor de una determinada celda. Por último, retornamos este componente.

*En el tercer condicional, verificamos que nuestra columna sea la número 5 de la tabla que estamos usando; al cumplirse la condición, usaremos nuestro elemento JComboBox "combo" al cual le aplicaremos el método "setSelectedItem()" y le pasamos como parámetro el valor de una celda determinada ubicada en la columna 5 de la tabla; esto permitirá, que en el Combo Box se muestre por defecto el valor que le hemos pasado como parámetro, finalmente retornamos nuestro componente.

if(model.getValueAt(row,column).getClass().equals(Boolean.class)){
          
    check.setSelected(Boolean.parseBoolean(model.getValueAt(row,column).toString()));
    return check;

}

if (column<5){

    lbl.setText(" "+model.getValueAt(row,column).toString());
    return lbl;

}

if(column==5){

    combo.setSelectedItem((model.getValueAt(row,column).toString()));
    return combo;

}
              

8- Después del último condicional, procedemos a retornar un componente por defecto, en el caso dado de que no se cumpla ninguna de las condiciones anteriores; en este caso retornamos nuestro componente JLabel "lbl":
return lbl;
9- Copiaremos y pegaremos el código resaltado en amarillo, inmediatamente después de la última línea (tblDatos.setModel(modelotblele);) del método del botón desde el cual agregamos valores y/o datos a la JTable.

10- En la primera parte de nuestro código, instanciaremos un objeto de la Clase "Render" que creamos anteriormente, y lo llamaremos "render"; luego, procederemos a crear dos componentes: un JComboBox al cual llamamos "comboBox", y un JCheckBox llamado "checkBox"; seguidamente procedemos a llenar nuestro Combo Box, con los elementos requeridos, tal cual como lo hicimos en nuestra Clase "Render":
Render render = new Render();

JComboBox comboBox = new JComboBox();
JCheckBox checkBox = new JCheckBox();

comboBox.addItem("Seleccione");
comboBox.addItem("Femenino");
comboBox.addItem("Masculino");
11- Esta parte es muy importante, ya que deberemos instanciar dos objetos de la Clase "DefaultCellEditor", a uno lo llamaremos "defaultCellEditor1" y le pasaremos como parámetro el JComboBox "comboBox" que hemos creado en el punto anterior; luego, hacemos lo mismo con el otro objeto, al cual lo llamaremos "defaultCellEditor2" pero le pasamos como parámetro nuestro elemento JCheckBox "checkBox".
Ahora, vamos a usar nuestra tabla la cual en este caso se llama "tblDatos", y le aplicaremos el método "getColumnModel", seguidamente usamos el método "getColumn()" al cual le pasamos el número de la columna sobre la cual queremos trabajar; seguidamente, usamos el método "setCellEditor()" pasándole como parámetro el objeto pertinente de la Clase DefaultCellEditor que creamos, esto dependerá si queremos que las celdas de dicha columna se muestren Combo Box o Check Box, teniendo en cuenta que estas columnas deben coincidir con las que definimos en nuestra Clase "Render":
 
DefaultCellEditor defaultCellEditor1=new DefaultCellEditor(comboBox);
DefaultCellEditor defaultCellEditor2=new DefaultCellEditor(checkBox);

tblDatos.getColumnModel().getColumn(5).setCellEditor(defaultCellEditor1);
tblDatos.getColumnModel().getColumn(6).setCellEditor(defaultCellEditor2);

       
tblDatos.setDefaultRenderer(tblDatos.getColumnClass(0), render);
                                               

12- Para terminar, luego de la última línea de código del punto anterior, usaremos nuevamente nuestra tabla "tblDatos", aplicándole el método "setDefaultRenderer()", a dicho método le pasaremos 2 parámetros; en el primero debemos usar nuevamente nuestra JTable a la cual le aplicamos el método "getColumnClass()" así mismo, a ese método le pasamos un parámetro el cual será el número de cualquier columna de nuestra tabla, en este caso "0" (cero); ahora el segundo parámetro que le pasamos al método "setDefaultRenderer" será el objeto que instanciamos de nuestra Clase "Render".
tblDatos.setDefaultRenderer(tblDatos.getColumnClass(0), render);
Nota: Es posible que te estés preguntando para que sirven estás líneas de código de los puntos 11 y 12.
Bueno, en sí tanto el código del punto 11 como el del 12, se complementen entre sí para obtener un resultado óptimo en la apariencia de las celdas de nuestra JTable. 
El código del punto 11 lo que nos permitirá es que cuando procedamos a editar o demos clic sobre una celda de la columna a la cual le hemos aplicado por ejemplo el objeto "defaultCellEditor1" se seguirá mostrando el componente JComboBox, y el código del punto 12 permitirá que sobre dicha celda se muestre este componente aún si no estamos trabajando sobre ella.
Para que quede un poco más claro, si no usamos el código del punto 11 pero sí el del punto 12, cuando demos clic sobre dicha celda esta dejará de ser o de mostrarse como un Combo Box y sólo se mostrará cuando no la seleccionemos, pero si en cambio aplicamos el código del punto 11 pero no el del 12, cuando agreguemos datos a nuestra tabla, las celdas aparecerán normales; es decir, no se mostrará el Combo Box, pero si damos clic sobre ella sí se mostrará dicho elemento. Por ello, es necesario que usemos el código de ambos puntos (11 y 12), para que las celdas tengan la misma apariencia y comportamiento en todo momento

13- Ahora sólo basta con ejecutar tu proyecto y hacer las respectivas pruebas.

14- Si deseas saber cómo asignar Check Box a una Jtable, sin necesidad de código, y de forma netamente gráfica usando un entorno de desarrollo integrado como Netbeans IDE, puedes visitar el siguiente enlace:

 
15- Si te interesa, puedes seguir el Curso de Java, que se está realizando mediante videotutoriales y con eBooks, en el Blog UH T.I.S

¿Conoces una forma más óptima de realizar el anterior procedimiento?, no dudes en compartirla con todos nuestros amigos de la web.

Si te fue de gran ayuda esta información, no olvides compartirla con tus amigos y en las redes sociales.
Si tienes dudas o sugerencias al respecto; puedes dejarnos tus comentarios.
Bendiciones...





Comparte este código


2 comentarios:

  1. Buenas, quisiera que me indicaran como obtengo la fila seleccionada atra vez del combobox ya que tengo la seleccion o alternativa del combo box pero no asi la fila y necesito saberla para efectuar acciones con los datos de esa fila y columnas se agradece su gestion.

    ResponderEliminar
    Respuestas
    1. Saludo Estimada Andrea.
      Dirígete al siguiente artículo el cual te será de gran ayuda:

      Seleccionar registro de un JTable y mostrarlo en los campos de un formulario"

      ¡CRISTO TE AMA!

      Bendiciones...

      Eliminar