Foros del Web » Programación para mayores de 30 ;) » Java »

Checkbox en JTable

Estas en el tema de Checkbox en JTable en el foro de Java en Foros del Web. Hola a todos, el problema que tengo es que quiero poner en una columna de una tabla todos checkbox, para que pueda seleccionar que fila ...
  #1 (permalink)  
Antiguo 20/01/2010, 17:31
 
Fecha de Ingreso: julio-2009
Ubicación: General Cabrera
Mensajes: 14
Antigüedad: 14 años, 9 meses
Puntos: 0
Checkbox en JTable

Hola a todos, el problema que tengo es que quiero poner en una columna de una tabla todos checkbox, para que pueda seleccionar que fila quiero elegir.

El codigo que estuve haciendo hasta ahora es este:

TableColumn check = tabla.getColumnModel().getColumn(0);
JCheckBox checkbox = new JCheckBox();
check.setCellEditor(new DefaultCellEditor(checkbox));

Estuve mirando en algunos ejemplos, y mas o menos era así, pero cuando lo ejecuto no me aparece nada en esa columna, sigue vacía.

Espero que alguien me ayude, lo necesito lo antes posible.

Muchas gracias, saludos.
  #2 (permalink)  
Antiguo 01/02/2010, 14:11
 
Fecha de Ingreso: julio-2009
Ubicación: General Cabrera
Mensajes: 14
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Checkbox en JTable

Hola a todos, por favor si alguien me puede dar una mano. Hace como un mes que estoy renegando no se por donde seguir.

Le agredezco su ayuda

Saludos
  #3 (permalink)  
Antiguo 01/02/2010, 21:18
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Checkbox en JTable

Hola,

El tipo de datos de esa columna debe ser boolean. El método para especificar varía dependiendo de la forma como llenas el TableModel, y si diseñaste tu propio TableModel de AbstractTableModel.

Si utilizas el DefaultTableModel podrías especificar los datos como 'false' en esa columna, por ejemplo:

Código:
        ... new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {false, "", "", ""},
                {false, "", "", ""},
            }, ...
Si estas usando NetBeans, selecciona la tabla, en las propiedades selecciona model y abre el editor con doble click, en ajustes de tabla puedes cambiar el tipo, y allí seleccionas Boolean. NetBeans te crea el siguiente código:

Código:
        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Boolean.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
        });
Si diseñaste tu propio TableModel, la primera columna debe ser Boolean.

Saludos,
  #4 (permalink)  
Antiguo 02/02/2010, 09:38
 
Fecha de Ingreso: julio-2009
Ubicación: General Cabrera
Mensajes: 14
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Checkbox en JTable

Hola HackmanC, gracias por responder. Para decir que la columna 0 (cero) se boolean debo hacer asi: ?????

public Class getColumnClass(int c) {
if (c == 0){
try {
return Class.forName("java.lang.Boolean"); }catch (ClassNotFoundException e) {
e.printStackTrace();
}

}
else{
return (new String()).getClass();
}
return null;
}

Lo tengo echo así pero no me muestra ningun checkbox en la tabla, que más me puede faltar hacer?????
  #5 (permalink)  
Antiguo 02/02/2010, 11:57
Avatar de dackiller  
Fecha de Ingreso: septiembre-2003
Ubicación: The Matrix
Mensajes: 341
Antigüedad: 20 años, 7 meses
Puntos: 4
Respuesta: Checkbox en JTable

Cita:
Iniciado por tambu10 Ver Mensaje
Hola a todos, el problema que tengo es que quiero poner en una columna de una tabla todos checkbox, para que pueda seleccionar que fila quiero elegir.

El codigo que estuve haciendo hasta ahora es este:

TableColumn check = tabla.getColumnModel().getColumn(0);
JCheckBox checkbox = new JCheckBox();
check.setCellEditor(new DefaultCellEditor(checkbox));

Estuve mirando en algunos ejemplos, y mas o menos era así, pero cuando lo ejecuto no me aparece nada en esa columna, sigue vacía.

Espero que alguien me ayude, lo necesito lo antes posible.

Muchas gracias, saludos.
Creo que tu problema esta en que no le estas diciendo al JTable que la columna 0 es editable...

Si usas Netbeans:
Código:
Click derecho en el JTable > Table Contents > Columns 

Selecciona la columna 0 y marca la opcion Editable
Si usas una Clase TableModel, debes implementar el metodo abstracto:

Código:
@Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        if(columnIndex == 0){
            return true;
        }else{
            return false;
        }
    }
Espero esto te ayude..

Saludos...
__________________
--
NOTA: Si haz conseguido la solución a tu problema, por favor edita el titulo del tema colocando el prefijo [SOLUCIONADO], para que otros usuarios puedan encontrar soluciones más rápido.
  #6 (permalink)  
Antiguo 02/02/2010, 17:03
 
Fecha de Ingreso: julio-2009
Ubicación: General Cabrera
Mensajes: 14
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Checkbox en JTable

Tenias razon dackiller faltaba poner que esa columna sea editable. El único problema que falta resolver es, cuando ejecuto esa GUI (ventana grafica) se ve bien como deberia quedar, pero cuando ejecuto el sistema completo, al abrir esa ventana me la muestra mal, se ve todo gris, como si un fondo gris tapara dicha ventana.

El error que me tira es el sig:

Exception occurred during event dispatching:
java.lang.ClassCastException
at javax.swing.JTable$BooleanRenderer.getTableCellRen dererComponent(JTable.java:3401)
at javax.swing.JTable.prepareRenderer(JTable.java:369 3)
at javax.swing.plaf.basic.BasicTableUI.paintCell(Basi cTableUI.java:1149)
at javax.swing.plaf.basic.BasicTableUI.paintCells(Bas icTableUI.java:1051)
at javax.swing.plaf.basic.BasicTableUI.paint(BasicTab leUI.java:974)
at javax.swing.plaf.ComponentUI.update(ComponentUI.ja va:142)
at javax.swing.JComponent.paintComponent(JComponent.j ava:541)
at javax.swing.JComponent.paint(JComponent.java:808)
at javax.swing.JComponent.paintChildren(JComponent.ja va:647)
at javax.swing.JComponent.paint(JComponent.java:817)
at javax.swing.JViewport.paint(JViewport.java:707)
at javax.swing.JComponent.paintChildren(JComponent.ja va:647)
at javax.swing.JComponent.paint(JComponent.java:817)
at javax.swing.JComponent.paintChildren(JComponent.ja va:647)
at javax.swing.JComponent.paint(JComponent.java:817)
at javax.swing.JComponent.paintChildren(JComponent.ja va:647)
at javax.swing.JComponent.paint(JComponent.java:817)
at javax.swing.JComponent.paintChildren(JComponent.ja va:647)
at javax.swing.JComponent.paint(JComponent.java:817)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:5 52)
at javax.swing.JComponent.paintChildren(JComponent.ja va:647)
at javax.swing.JComponent.paintWithOffscreenBuffer(JC omponent.java:4778)
at javax.swing.JComponent.paintDoubleBuffered(JCompon ent.java:4724)
at javax.swing.JComponent.paint(JComponent.java:798)
at java.awt.GraphicsCallback$PaintCallback.run(Graphi csCallback.java:21)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGra phicsCallback.java:60)
at sun.awt.SunGraphicsCallback.runComponents(SunGraph icsCallback.java:97)
at java.awt.Container.paint(Container.java:1309)
at sun.awt.RepaintArea.paint(RepaintArea.java:177)
at sun.awt.windows.WComponentPeer.handleEvent(WCompon entPeer.java:260)
at java.awt.Component.dispatchEventImpl(Component.jav a:3699)
at java.awt.Container.dispatchEventImpl(Container.jav a:1623)
at java.awt.Window.dispatchEventImpl(Window.java:1590 )
at java.awt.Component.dispatchEvent(Component.java:34 80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 450)
at java.awt.EventDispatchThread.pumpOneEventForHierar chy(EventDispatchThread.java:197)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:140)
at java.awt.Dialog.show(Dialog.java:538)
at java.awt.Component.show(Component.java:1134)
at java.awt.Component.setVisible(Component.java:1089)
at client.listadoFaltantes.MediadorListadoFaltantes.v isualizar(MediadorListadoFaltantes.java:141)
at client.listadoFaltantes.MediadorListadoFaltantes.i nicializar(MediadorListadoFaltantes.java:52)
at client.listadoFaltantes.MediadorListadoFaltantes.< init>(MediadorListadoFaltantes.java:33)
at client.iniciarSesion.MediadorMaster.medListFaltant es(MediadorMaster.java:292)
at client.iniciarSesion.MediadorMaster.actionPerforme d(MediadorMaster.java:135)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:1764)
at javax.swing.AbstractButton$ForwardActionEvents.act ionPerformed(AbstractButton.java:1817)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:419)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:257)
at javax.swing.AbstractButton.doClick(AbstractButton. java:289)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Bas icMenuItemUI.java:1113)
at javax.swing.plaf.basic.BasicMenuItemUI$MouseInputH andler.mouseReleased(BasicMenuItemUI.java:943)
at java.awt.Component.processMouseEvent(Component.jav a:5134)
at java.awt.Component.processEvent(Component.java:493 1)
at java.awt.Container.processEvent(Container.java:156 6)
at java.awt.Component.dispatchEventImpl(Component.jav a:3639)
at java.awt.Container.dispatchEventImpl(Container.jav a:1623)
at java.awt.Component.dispatchEvent(Component.java:34 80)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:3450)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:3165)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:3095)
at java.awt.Container.dispatchEventImpl(Container.jav a:1609)
at java.awt.Window.dispatchEventImpl(Window.java:1590 )
at java.awt.Component.dispatchEvent(Component.java:34 80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 450)
at java.awt.EventDispatchThread.pumpOneEventForHierar chy(EventDispatchThread.java:197)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:144)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:136)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:99)

A ver si alguien me puede dar una mano asi termino esto de una vez por toda.

SAludos
  #7 (permalink)  
Antiguo 02/02/2010, 19:27
Avatar de dackiller  
Fecha de Ingreso: septiembre-2003
Ubicación: The Matrix
Mensajes: 341
Antigüedad: 20 años, 7 meses
Puntos: 4
Respuesta: Checkbox en JTable

Revisa tu CellRender de esa columna, igualmente tienes que setearla para que devuelva el componente deseado.
__________________
--
NOTA: Si haz conseguido la solución a tu problema, por favor edita el titulo del tema colocando el prefijo [SOLUCIONADO], para que otros usuarios puedan encontrar soluciones más rápido.
  #8 (permalink)  
Antiguo 02/02/2010, 23:27
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Checkbox en JTable

Hola,

Cita:
Iniciado por tambu10 Ver Mensaje
...
javax.swing.JTable$BooleanRenderer.getTableCellRendererComponent(JTable.java :3401)
...
Posiblemente ... los datos deben ser boolean.

Lo que no has mostrado es la forma en que llenas la tabla, y si tienes tu propio TableModel. Si llenas los datos con "Integer", "String", "Integer" ... la primera columna está amarrada a un Integer (O puede ser otro tipo de datos), agrega un dato al principio que sea Boolean y especifíca la clase en el TableModel.

Por ejemplo:

Código:
public class Main {

    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        new JFrame().setVisible(true);
    }

    private class JFrame extends javax.swing.JFrame {
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JTable jTable1;
        public JFrame() {
            jScrollPane1 = new javax.swing.JScrollPane();
            jTable1 = new javax.swing.JTable();
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            jTable1.setModel(new javax.swing.table.DefaultTableModel(
                    new Object[][]{
                        {false, 1, null, null},
                        {false, 2, null, null},
                        {false, 3, null, null},
                        {false, 4, null, null}
                    },
                    new String[]{
                        "Title 1", "Title 2", "Title 3", "Title 4"
                    }) {
                Class[] types = new Class[]{
                    java.lang.Boolean.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class
                };
                @Override
                public Class getColumnClass(int columnIndex) {
                    return types[columnIndex];
                }
            });
            jScrollPane1.setViewportView(jTable1);
            getContentPane().add(jScrollPane1);
            pack();
        }
    }
}
Así no tienes que cambiar el Render ni el Editor y te ahorras este problema.

(No es necesario poner 'false' en la primera columna como mencioné anteriormente en el otro post, puede ser null, con redefinir el método 'getColumnClass' es más que suficiente en el AbstractTableModel o DefaultTableModel)

Saludos,
  #9 (permalink)  
Antiguo 03/02/2010, 17:12
 
Fecha de Ingreso: julio-2009
Ubicación: General Cabrera
Mensajes: 14
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Checkbox en JTable

Hola gente, le comento que ya pude solucionar la primera parte. Pude mostrar la ventana con los correspondientes checkbox en la primera columna, pero ahora el problema que tengo es que al seleccionarlos no hacen nada, es decir no se tildan.

No se que me puede faltar, estuve viendo algunos ejemplos pero es distinto en este caso que los tengo dentro de una tabla.

Si alguien tiene alguna idea de que puede ser, le agredecería.

Muchas gracias, saludos.
  #10 (permalink)  
Antiguo 08/02/2010, 05:31
 
Fecha de Ingreso: julio-2009
Ubicación: General Cabrera
Mensajes: 14
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Checkbox en JTable

Hola gente, alguien tiene idea que me puede faltar para que funcione los malditos checkbox.
Ya los veo bien en la tabla, pero no tienen funcionalidad. Estuve averiguando, pero encontre miles de respuestas.

Yo igual seguiré probando, si lo llego a solucionar aviso.

Muchas gracias
  #11 (permalink)  
Antiguo 12/02/2010, 07:24
 
Fecha de Ingreso: julio-2009
Ubicación: General Cabrera
Mensajes: 14
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Checkbox en JTable

Hola a todos, estuve averiguando un poco y me quedó una duda, puede ser un motivo no tener guardado en la base de datos una variable que represente el checkbox, ya que los mismo no tiene funcionalidad dentro de la tabla. Es decir, al seleccionarlos no se tildan.

Otra cosita, por lo que se, para darle funcionalidad a los botones (JButton) debemos crear un metodo setActionListener, alguien sabe cual es el método para los checkbox?????

Espero sus respuestas

Muchas gracias, un saludo a todos.
  #12 (permalink)  
Antiguo 16/02/2010, 13:01
Avatar de pablor21  
Fecha de Ingreso: noviembre-2008
Ubicación: Montevideo - Uruguay
Mensajes: 197
Antigüedad: 15 años, 5 meses
Puntos: 13
Respuesta: Checkbox en JTable

hola, para que tenga funcionalidad un checkbox debes hacer esa celda editable, si no no te va a funcionar...

Lo mejor para agregar una funcionalidad a un botón es a través del addActionListener así:

supongo que tenés un botón llamado myButton

myButton.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {
//codigo que deseas ejecutar
}
});

  #13 (permalink)  
Antiguo 16/02/2010, 14:53
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Checkbox en JTable

Hola,

Voy a intentar explicar el concepto inicial que mencioné y estoy casi seguro que ese es el motivo por el cual no funciona como deseas y te evitas muchos inconvenientes. (Espero que se entienda).

El TableModel guarda los datos que vas a mostrar en el JTable, esos datos deben corresponder exactamente igual en el modelo y en la tabla, en tipo de datos y valores. Si el TableModel tiene valores Boolean encones JTable se encarga de todo lo demás (desplegar el CheckBox).

Por ejemplo:

El TableModel ...

Código:
Boolean | Int | String | String ...
Boolean | Int | String | String ...
Boolean | Int | String | String ...
En ese caso el JTable va a usar un CheckBox automáticamente en la primera columna, solamente tienes que unir el TableModel con el JTable y no necesitas renders, ni editors, ni hacerlo editable, ni observar eventos.

Ahora bien, nunca mencionaste que tipo y como llenas el TableModel, y si hiciste tu propio TableModel del AbstractTableModel.

Pero de cualquier forma si @Overrides el método 'getColumnClass' y devuelves un Boolean en la primera columna, y además tienes manejas 'verdaderamente' valores Boolean en esa columna, es decir el getValueAt y setValueAt, etc. regresan Boolean en esa columna, automáticamente se va desplegar un CheckBox completamente editable y funcional.

Y no necesitas listeners para saber cual está 'encendido' o 'apagado' puesto que lo tendrías en el TableModel.

Código:
False | 1 | "Hello" | "World" ...
False | 8 | "Hello" | "World" ...
True  | 4 | "Hello" | "World" ...
El único caso que necesitas listeners es que necesites que al seleccionarse se abra otra ventana o cambie otro valor del JTable automáticamente, o realice alguna otra actividad que no sea activar el CheckBox.

Cita:
... puede ser un motivo no tener guardado en la base de datos una variable que represente el checkbox, ....
Es lo que vengo diciendo desde el primer post. Pero no es necesario que lo tengas en la base de datos, solo en el TableModel.

Espero que ahora haya quedado mas claro,
Sino deplano ... no hay forma de explicarlo,

Saludos,
  #14 (permalink)  
Antiguo 17/02/2010, 17:12
 
Fecha de Ingreso: julio-2009
Ubicación: General Cabrera
Mensajes: 14
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Checkbox en JTable (Solucionado)

Muchas gracias HackmanC, sos un capo. Gracias a dios pude solucionar el tema de los checkbox que no tenía funcionalidad.
Lo que estaba haciendo mal, eran los métodos setValueAt y la forma en que cargaba la tabla. En esa columna nunca cargaba un booleano y por ende me tiraba el error.

La columna debería cargarse asi:
Object[] temp = {Boolean.valueOf(false),
producto.getCod(),
producto.getDescripcion(),
Verificar.convertirAString(producto.getStockMax()) ,
Verificar.convertirAString(producto.getExistencia( )),
Verificar.convertirAString(producto.getStockMin()) ,
Verificar.convertirAString(cantRecomendada),
""};

y el método setValueAt debería implementarse de la sig. manera:

public void setValueAt(Object aValue, int indiceFila, int indiceColumna) {
if (indiceColumna != 0){
datos[indiceFila][indiceColumna] = aValue;
//fireTableCellUpdated(indiceFila, indiceColumna);
}
else{
datos[indiceFila][0] = (Boolean)aValue;
//fireTableCellUpdated(indiceFila, indiceColumna);
}
}

Espero que hayan entendido como lo pude entender yo. Le agradezco a todos por su ayuda.
Muchas gracias, un saludo.
  #15 (permalink)  
Antiguo 17/02/2010, 19:38
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Checkbox en JTable (Solucionado)

Hola,

Que bueno que pudister resolver ese inconveniente,

Cita:
Iniciado por tambu10 Ver Mensaje
... Espero que hayan entendido como lo pude entender yo. ...
... yo estoy conciente que a mí muchas veces me cuesta mucho darme a entender, y seguramente no lo habias entendido porque yo no lo había explicado correctamente, solamente se hace con el afán de ayudar. Aparte, es increible lo que yo he aprendido aquí, inclusive solamente con leer.

Saludos,

Etiquetas: checkbox, jtable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:16.