Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Problema para contar checkbox en JTable! Help!!

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:
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:

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:
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!

septiembre 21, 2016 | Unregistered CommenterMavip

Amigo:
confieso que no me le'i todo el código que pusiste, puesto que es bassssstante, pero le puedo hacer una recomendación: no es necesario insertar un checkBox dentro de la tabla, pues cuando usted inserta una tabla en su ventana (por los menos las JTable de Swing que el NetBeans ofrece) puedes darle clik derecho/Table Contents/Columns y si seleccionas la columna, marcas en donde dice "Editable" para poder cambiar el valor de la columna (aunque aparece marcado por defecto), y en el valor "Type" despliegas y pones "Boolean" automáticamente esa columna se te convierte en un ChekBox, sin tener que complicarte la existencia con el código, luego el valor de las tuplas de esa columna los cambias asignándole los valores "true" o "false"; finalmente, para detectar cuándo marcas o desmarcas uno de esos chekBox, solo tienes que poner tu código en el evento "onActionPerformed" de la tabla, y listo, cada vez que hagas un cambio en la tabla el código se ejecutará.

septiembre 23, 2016 | Unregistered CommenterYYanes