Java - Problema para contar checkbox en JTable! Help!!

 
Vista:

Problema para contar checkbox en JTable! Help!!

Publicado por Mavip (2 intervenciones) el 21/09/2016 17:55:54
Necesito ayuda!!!! Tengo un Jtable con datos de una BD de mysql, a este Jtable le inserte jcheckbox... la idea es que cada que vaya seleccionando un checkbox me vaya imprimiendo el valor seleccionado y me lo vaya acumulando.

El problema es que al seleccionar el checkbox no me imprime el valor hasta que selecciono el siguiente

Por ejemplo, de la siguiente calumna de datos:
A
B
C
D

al seleccionar A, me debe imprmir la letra A, pero no es hasta que hago la segunda seleccion de checkbox que me imprime la A, y al seleccionar el tercer checkbox me imprime la segunda letra.

Ya intente moviendo los valores del for, pero no he podido solucionarlo, a continuacion anexo el código de la clase que genera la tabla y las que le dan el formato a los checkbox, espero me puedan ayudar a enocntrar el error:

Este es el código donde genero las Jtables con sus checkbox
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
Object rowData2[][] = {{"Row1-Column1","Row1-Column2"}};
Object columnNames2[] = {"","Empalmes"};
 
 
DefaultTableModel mTableModel2 = new DefaultTableModel(rowData2, columnNames2);
 
try {
        java.sql.Connection con = DriverManager.getConnection (url, usr, pass);
        java.sql.Statement stmt = con.createStatement();
 
 
        ResultSet rs = stmt.executeQuery ("SELECT * FROM details_gsdm "
                + "WHERE details_gsdm.codigo LIKE '%"+codigo+"%' AND details_gsdm.np <>'' AND details_gsdm.C18 <> 'BUILD CAT' AND details_gsdm.c17 ='FA EQUIP' AND (details_gsdm.c18 ='1145' OR details_gsdm.c18 ='1005' OR details_gsdm.c18 ='1025' OR details_gsdm.c18 ='1020')"
                + "GROUP BY C6;");
 
        Object[] rows;
 
        while (rs.next()) {
            rows = new Object[]{false,rs.getString(6)}; //PARA CHECBOX
            mTableModel2.addRow(rows);
        }
        rs.close();
        stmt.close();
        con.close();
 
    } catch (SQLException e) {
        //JOptionPane.showMessageDialog(null,"checalo bien "+e);
            }
 
final JTable t2 = new JTable (mTableModel2);
 
t2.setModel(mTableModel2);
 
//PARA CHECKBOX    
//Se crea el JCheckBox en la columna indicada en getColumn, en este caso, la primera columna
t2.getColumnModel().getColumn( 0 ).setCellEditor( new Celda_CheckBox() );
//para pintar la columna con el CheckBox en la tabla, en este caso, la primera columna
t2.getColumnModel().getColumn( 0 ).setCellRenderer(new Render_CheckBox());
 
t2.setCellSelectionEnabled(true);
t2.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
//Establece el ancho de las columnas
t2.getColumnModel().getColumn(0).setPreferredWidth(23);
t2.getColumnModel().getColumn(1).setPreferredWidth(72);
 
//Centra el texto de la segunda columna
DefaultTableCellRenderer tcr = new DefaultTableCellRenderer();
tcr.setHorizontalAlignment(SwingConstants.CENTER);
t2.getColumnModel().getColumn(1).setCellRenderer(tcr);
 
sp = new JScrollPane(t2);
sp.setBounds(25, 120, 113, 135);
sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
 
p1.add(sp);
mTableModel2.removeRow(0);
 
    t2.getModel().addTableModelListener((TableModelEvent e) -> {
        String acumulador="";
        String circuito;
 
        for( int i=0 ; i<mTableModel2.getRowCount() ; i++)
        {
        circuito="details_gsdm.C6 = '"+(String)mTableModel2.getValueAt(i, 1)+"' OR ";
 
                        if ( mTableModel2.getValueAt(i, 0).equals(true)) {
                            try{
                                acumulador=acumulador+circuito;
                            }
                            catch (NumberFormatException nfe){ //si existe un error se coloca 0 a la celda
                                JOptionPane.showMessageDialog(null,"Error: El orden de las columnas es incorrecto "+nfe);
                            }
                        }//if  
 
        }//for
        String nuevoAcumulado = acumulador.substring(0,acumulador.length()-3);
       // JOptionPane.showMessageDialog(null,nuevoAcumulado);
        l6.setText(nuevoAcumulado);
    });

Y está la clase Celda_CheckBox:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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) {
        //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 );
    }
 
}

Y la clase Render_CheckBox:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Render_CheckBox extends JCheckBox implements TableCellRenderer {
 
    private final JComponent component = new JCheckBox();
 
    /** Constructor de clase */
    public Render_CheckBox() {
        setOpaque(true);
    }
 
 
    @Override
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
 
      boolean b = ((Boolean) value).booleanValue();
      ( (JCheckBox) component).setSelected( b );
 
      return ( (JCheckBox) component);
  }
 
}

Ojala alguien pueda ayudarme, de verdad es algo urgente :S
de antemano Gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Problema para contar checkbox en JTable! Help!!

Publicado por YYanes (144 intervenciones) el 26/09/2016 19:45:08
Hola amigo:

no revisé todo su código, pues ciertamente me parece un poco extenso, pero pude apreciar lo siguiente: usted está verificando el valor delChekBox dentro del evento "CellRenderer", y creo (auqnue no estoy 100% seguro) que este evento transcurre luego de que el componente es construído e impreso, por eso no te va a actualizar la selección hasta que hagas la siguiente.

Pero mira, no te compliques la existencia, el NetBeans (al menos el 6.9 que yo utilizo) trae un grupo de componentes de Swing, y entre ellos, el jTable. Cuando pones una de estas tablas sobre tu frame o ventana, puedes darle clik derecho y acceder al contenido de la tabla (Table Content), si vas a la pestaña "Columns" encontrarás las columnas definidas para la misma, y si seleccionas la primera columna (la de los chekbox) y en donde dice "Type" despliegas y le pones "Boolean" automáticamente esa columna se convierte en checkBox, sin tener que crearlos dinámicamente, y para cambiar su valor (seleccionado o no-seleccionado) basta con asignarle valor "true" o "false". Por ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//supongamos que tenemos una tabla con las columnas "selecc", y "col"
public void ListarGrupos()
{
    DefaultTableModel tabla = (DefaultTableModel) jTableX.getModel();
    tabla.setNumRows(0);
 
    for (int i = 0; i <3; i++) {
        Object[] row = {false, "col -" + i};
        tabla.addRow(row);
    }
}
/*Si la primera coumna en las propiedades de la tabla está definida como "Boolean" esta columna se mostrará en forma de checkBox, luego para preguntar por sus filas selecciondas: */
 
  String valor = "";
  int cantFilas = jTableX.getRowCount();
 
  for(int i=0; i<cantFilas; i++)
  {
    if(jTableX.getValueAt(i, 0).toString().compareTo("true")==0)
      valor = jTableX.getValueAt(i, 1).toString();    //fila seleccionada, y valor guardado en la variable "valor"
  }
 
/*este último bloque de código lo tienes que poner en el evento PropertyChange de la tabla, para que se ejecute cada vez que cambies un valor de la misma (en este caso, el chekbox de la primera columna)*/

Un GigaSaludo y suerte!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Problema para contar checkbox en JTable! Help!!

Publicado por Mavirp (2 intervenciones) el 26/09/2016 22:24:23
Muchas gracias por contestar!!!
Tienes razón, me estaba complicando demasiado, con tu ayuda solo modifique unas lineas de código y se soluciono el problema.

Gracias por tu tiempo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema para contar checkbox en JTable! Help!!

Publicado por YYanes (144 intervenciones) el 26/09/2016 22:45:51
No hay de qué, amigo, encantado de haberlo podido ayudar!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar