Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Componentes / Java / JCheckBox dentro JTable con Netbeans

JCheckBox dentro JTable con Netbeans

Autor jc mouse lunes, julio 9, 2012

JTable swing

Para colocar un JCheckBox dentro una celda de un JTable debemos sobre escribir algunas clases para que el componente pueda ser pintado en el JTable, si se desea colocar cualquier otro componente, el procedimiento es similar, teniendo cuidado claro, en los métodos propios de cada componente swing.

Lo primero que debe hacerse, es crear una nueva clase que se extienda de DefaultCellEditor e implemente TableCellRenderer, esto para indicarle al JTable que tipo de componente debe utilizar al momento de introducir la información.

import java.awt.Color;
import java.awt.Component;
import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
/**
 * @web http://www.jc-mouse.net
 * @author Mouse
 */
public class Celda_CheckBox extends DefaultCellEditor implements TableCellRenderer  {

    private JComponent component = new JCheckBox();    
    private boolean value = false; // valor de la celda

    /** Constructor de clase */
    public Celda_CheckBox() {
        super( new JCheckBox() );
    }

    /** retorna valor de celda */
    @Override
    public Object getCellEditorValue() {
        return ((JCheckBox)component).isSelected();        
    }

    /** Segun el valor de la celda selecciona/deseleciona el JCheckBox */
    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        //Color de fondo en modo edicion
        ( (JCheckBox) component).setBackground( new Color(200,200,0) );
        //obtiene valor de celda y coloca en el JCheckBox
        boolean b = ((Boolean) value).booleanValue();
        ( (JCheckBox) component).setSelected( b );
        return ( (JCheckBox) component);     
    }

    /** cuando termina la manipulacion de la celda */
    @Override
    public boolean stopCellEditing() {        
        value = ((Boolean)getCellEditorValue()).booleanValue() ;
        ((JCheckBox)component).setSelected( value );
        return super.stopCellEditing();
    }

    /** retorna componente */
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
         if (value == null)
            return null;         
         return ( (JCheckBox) component );
    }

}

Para que el JTable pinte el componente, creamos otra clase, esta vez que se extienda de JCheckBox, el componente que queremos pintar e implemente TableCellRenderer, la clase es la siguiente.

import java.awt.Color;
import java.awt.Component;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
/**
 * @web http://www.jc-mouse.net
 * @author Mouse
 */
public class Render_CheckBox extends JCheckBox implements TableCellRenderer {

    private JComponent component = new JCheckBox();

    /** Constructor de clase */
    public Render_CheckBox() {
        setOpaque(true);
    }

  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
      //Color de fondo de la celda
      ( (JCheckBox) component).setBackground( new Color(0,200,0) );
      //obtiene valor boolean y coloca valor en el JCheckBox
      boolean b = ((Boolean) value).booleanValue();
      ( (JCheckBox) component).setSelected( b );
      return ( (JCheckBox) component);
  }

}

Resumiendo, para pintar un componente swing dentro una celda de una tabla JTable, debemos crear dos clases una para manipular los valores de la celda (Celda_CheckBox) con el propio componente y otra para pintar el componente.

Para implementar estas clases en el JTable, debemos indicarle que columna es la que contendrá el componente swing en el modo edición, de la siguiente manera:

jTable1.getColumnModel().getColumn( 0 ).setCellEditor( new Celda_CheckBox() );

y también indicar que columna pintara el JCheckBox en todo momento.

jTable1.getColumnModel().getColumn( 0 ).setCellRenderer(new Render_CheckBox());

Un ejemplo completo que se inicia en el constructor de una clase JFrame llamado interfaz el cual tiene un JTable, ademas se hace uso de un TableModel para colocar algunos datos:

public interfaz() {
        initComponents();
        this.setTitle("jTable con jCheckBox - [ http://www.jc-mouse.net/ ]");         

        //se crea un TableModel con algunos datos y se asigna al JTable
        DefaultTableModel TableModel = new DefaultTableModel();
        TableModel.setDataVector(new Object[][] {
        { false, "Juan Perez", "12", "Hombre" },
        { false, "Homero J. Simpsons", "40", "Hombre" },
        { true, "Ned Flanders", "35", "Hombre" },
        { true, "Asuka Langley", "15", "Si gracias" },
        { false, "Rei Ayanami", "16", "Mujer" },
        { true, "shinji ikari", "15", "No se sabe" } }, new Object[] {
        "CheckBox", "Nombre", "Edad", "Sexo" });
        jTable1.setModel(TableModel);
        //Se crea el JCheckBox en la columna indicada en getColumn, en este caso, la primera columna
        jTable1.getColumnModel().getColumn( 0 ).setCellEditor( new Celda_CheckBox() );
        //para pintar la columna con el CheckBox en la tabla, en este caso, la primera columna
        jTable1.getColumnModel().getColumn( 0 ).setCellRenderer(new Render_CheckBox());      

    }

Resultado

JTable swing

Descarga ejemplo utilizado en el tutorial HERE digo AQUI

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

Animación de JProgressBar con hilos

Animación de JProgressBar con hilos

Si nuestra aplicación tiene que llevar a cabo un cierto trabajo que no sabemos cuanto durará y que a la vez consume much...

Sistema de gestión de stock – El Controlador (Parte 5)

Sistema de gestión de stock – El Controlador (Parte 5)

Para terminar el tutorial, debemos unir tanto la VISTA como el MODELO y para eso esta el CONTROLADOR. o.O El controlador...

ExecutorService: Tareas asíncronas

ExecutorService: Tareas asíncronas

Desde java 7 esta disponible la interface ExecutorService que se extiende de Executor y nos proporciona los métodos nece...

Login estilo Google

Login estilo Google

Google tiene entre su formulario de autenticación de usuario para sus diferentes servicios (gmail, blogger, youtube, g+)...

Personaliza un JComboBox estilo Metro de Windows

Personaliza un JComboBox estilo Metro de Windows

Si bien se pueden encontrar en google estilos java (Look and Feel) listos para cambiar la apariencia de nuestras aplicac...

Crea patrón de desbloqueo para tus app java

Crea patrón de desbloqueo para tus app java

El patrón de desbloqueo es una medida de seguridad que tienen algunos teléfonos inteligentes para evitar el acceso al di...

23 comentarios en “JCheckBox dentro JTable con Netbeans”

  1. Richard Maldonado dice:

    Un saludo cordial JC-Mouse, soy de Venezuela y un seguidor de tus proyectos, me han servido muchísimo para mi carrera de ing. de sistemas. Ante todo te felicito, eres GRANDE con todo lo que tiene que ver con la programación.

    Me gustaría saber si puedes ayudarme con un tropiezo sobre la edición en las celdas del JTable, necesito que al editar una celda no se concatene lo que escribo sino que reemplace el contenido.

    Tengo buen material de como resolver mi problema, aunque no logro implementarlo jejeje, en fin… En uno de tus proyectos diseñaste un componente “jcTablaAsignatura” y me gustaría que me ayudaras explicando como lo creaste para poder tomarlo como ejemplo y así poder crear un jtable que se adapte a mi proyecto.

    Estaré pendiente de cualquier respuesta ya que necesito de tu ayuda. Muchas gracias

    1. Mouse dice:

      pues implementas este mismo ejemplo pero en su lugar puedes colocar un JTextField e implementar los métodos que quieras para manejar los datos, la tabla a la que haces referencia, no es una tabla en si, me refiero no se extiende de un JTable, es un conjunto de textfield y otros componentes nada difícil de hacer, ya me pidieron el código y haré un tuto o video-tuto sobre como crearlo pero por el momento e estado ocupado y no me dio tiempo de hacer tutos largos, pero ya me voy desocupando y en los próximos días o semana a más tardar lanzo el tuto 🙂

  2. isaias dice:

    me gusto la implementacionde chcekbox dentro de una jtable mi pregunta es como puedo obtener el valor del chekcbox seleccionado

    1. Mouse dice:

      internamente lo guarda como TRUE y FALSE solo pinta el control checkbox dentro la tabla

  3. VIANEY VARGAS dice:

    Muchas gracias JC_Mouse por tu ayuda me ha servido de mucho los proyeectos y este si que mas ..de verdad gracias…. pero tengo una duda con otro proyecto aparte me podrias ayudar???? vvvvianey@gmail.com

  4. hans dice:

    Muchísimas Gracias JCMouse, este me sirvió bastante pa mi proyecto de clases, saluds desde Nicaragua 🙂

  5. Carlos dice:

    Muy bueno tu portan nos ayuda a aprender .. muchas gracias

    Queria preguntar quiero capturar el clik que se le hace al checkboc … quiero optener la posicion de la fila

    gracias

  6. JOSE LUIS dice:

    hola implemente tu código en un modelo que me resulta de una consulta en MySql. De esta forma
    DefaultTableModel modelo = (DefaultTableModel)jTable1.getModel();
    jTable1.getColumnModel().getColumn( 0 ).setCellEditor( new Celda_CheckBox() );
    jTable1.getColumnModel().getColumn( 0 ).setCellRenderer(new Render_CheckBox());
    //LLENAR TABLA
    rs = s.executeQuery(“”
    + ” SELECT Codigo, Producto, Cantidad”
    + ” FROM vendidos ”
    + ” WHERE FolioDeVenta = ‘”+folio+”‘”);
    while(rs.next()){
    datos[0]= false;//aqui le mando el valor por default al check box
    datos[1]= rs.getString(1);
    datos[2]= rs.getString(2);
    datos[3]= rs.getString(3);
    modelo.addRow(datos);
    }

    EL DETALLE ESTA QUE CUANDO ACTIVO UN CHECK BOX Y RECORRO LA TABLA IMPRIMIENTO SUS VALORES, SIEMPRE ME MUESTRA FALSO.
    ESTE ES MI CODIGO PARA RECORRER:

    for(int i=0;i<jTable1.getRowCount();i++)
    {
    System.out.println(""+jTable1.getValueAt(i, 0));
    }

    1. john andres dice:

      Tengo el mismo problema y aún no lo he podido solucionar! alguna ayuda??

  7. Navirtual dice:

    Quisiera saber como recorrerlo, ocupo getCellEditorValue y me devuelve el valor del último, solo eso… me gustaría saber como se trabaja para obtener los valores?

  8. VIANEY VARGAS dice:

    amigo jc_mouse y como lo puedo hacer con base de datos ?????mi Jtable esta lleno con el metodo getDAta que obtiene los registros de una tabla pero quiero meterle el JChecbox como hago???? podrias explicarme????

    1. Mouse dice:

      para trabajar con tablas es mejor utilizar el TableModel, para cambiar un dato, solo debes enviar las coordenadas del mismo y el valor se actualiza en el JTable

  9. Ariel dice:

    Buenas amigo, igual que la mayoria tengo el problema del retorno de valor, siempre retorna falso aunque el JCheckBox este seleccionado. Alguna sugerencia.

  10. Ariel dice:

    Buena amigos, hay una solución al retorno de datos.
    La opción es usar el DefaultCellEditor, para eso solo creamos un JCheckBox y la agregamos como argumento.
    Para el CellRenderer utilizamos la segunda clase, que es la realmente importante.
    JCheckBox check = new JCheckBox();
    jTable1.getColumnModel().getColumn(5).setCellEditor(new DefaultCellEditor(check));
    jTable1.getColumnModel().getColumn(5).setCellRenderer(new Render_CheckBox());

    Para recuperar datos se puede utilizar un for.
    En este caso es un for que utilizo para remover las filas marcadas.
    El model es del DefaultTableModel, la mejor forma de recuperar datos.
    for (int i = 0; i < jTable1.getRowCount(); i++) {
    boolean res = Boolean.valueOf(model.getValueAt(i, 5).toString());
    System.out.println("indice " + i + " valor " + res);
    while (res) {
    model.removeRow(i);
    jTable1.repaint();
    }
    }

    1. Andrey dice:

      Gracias esta solución me funciono 😉

    2. Jona dice:

      Para Ariel, le doy gracias me resolviste ese problema gracias y también al del blog se los agradesco

    3. Roberto dice:

      Funciona 100% gracias

  11. Christian dice:

    Hola como estas? un favor mira yo hice este ejemplo en mi proyecto, pero ahora quiero obtener el checkbox que he seleccionado, supongo que eso se hara en el evento MouseClicked de CheckBox que has generado con el codigo de arriba, como te digo quisiera saber que checkBox he seleccionado para poder filtrar en un Comboox, necesitaria el nombre de los CheckBox que se generan en este ejemplo … o de que manera podria yo saber que checkbox estan seleccionados sin necesidad de presionar un boton, quiero saber al momento de hacerle click al checkbox. …. espero puedas ayudarme gracias!!!

  12. Alejandro dice:

    Primeramente gracias por el tutorial estuvo buenísimo, mi problema es el siguiente: necesito que al tildar el checkbox de la tabla me sume un valor numérico que posee una columna y me percate que mientras el checkbox no pierda el foco el no actualiza el valor; ej: si es que estaba con valor false y al dar click en el checkbox me marca seleccionado, pero al mientras no pierda el foco el sigue estaba false. Como se podría solucionar esto?

    1. JosepM dice:

      Alejandro, tengo el mismo problema y llevo varios dias peleandome con el. como lo solucionastes?
      gracias

  13. Abraham Chia dice:

    Mi estimado Amigo, tengo una consulta en relacion al presente ejemplo de incluir jcheckbox dentro de un Jtable, en mi caso requiero definir un jatble de 5 filas x 5 columnas, esto resulta en 25 celdas, y necesito poner en cada de esas celdas un jcheckbox que en value tenga un valor diferente.
    Puede ilustrame con alguna sugerencia, gracias
    Saludos
    Abraham

  14. MauricioV dice:

    Me sirvió mucho el código, pero tengo un problema…. necesito que cada que seleccione un checkbox me imprima el valor, pero al hacer la primera seleccion no me muestra nada, hasta que hago una segunda seleccion me imprime el valor de la primera, y al hacer la tercera seleccion me imprime el valor de la segunda.

    Ojala me puedas ayudar por favor, lo he intentado de muchas maneras y no logro hacer que me imprima el valor en cuanto selecciono la celda

    1. Victor dice:

      Hola ¿conseguiste que te funcionara? a mi me pasa lo mismo…

Los comentarios estan cerrados

Comparte lo que sabes

Categorias

Últimas entradas

El Tangram es un juego chino muy antiguo, esta compuesto por 7 piezas: un paralelogramo (romboide), un cuadrado y 5 triá...

Espresso es un framework de testing propiedad de Google que está dirigido a desarrolladores que creen que las pruebas au...

Harvard WorldMap es una plataforma de mapeo de código abierto en línea, desarrollado por el Centro de Análisis Geográfic...

Realizar pruebas sobre nuestro código nos permiten comprobar su correcto funcionamiento e integración con otros módulos...

Android Bolivia

MAUS