Según mi esquema de ese momento, como se deberia verse la ventana:
![]() |
(afortunadamente no me dedique al dibujo) |
Bueno, el tema es crear una tabla utilizando JTable y el modelo de datos DefaultTableModel y luego aplicar editores y renderers personalizados sobre la columna que deseamos, en este caso la segunda columna.
Para crear una tabla con datos pueden verlo en el post: JTable I.
Necesitaremos implementar TableCellRenderer, para que en la segunda fila, nos muestre un JCheckBox tildado o no, según el dato que contenga la tabla. Esto puede ser un valor verdadero o falso, o lo que nosotros programemos, por ejemplo que muestre tildado todos los valores mayores a 100.
class CheckBoxRenderer extends JCheckBox implements TableCellRenderer {
CheckBoxRenderer() {
setHorizontalAlignment(JLabel.CENTER);
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (isSelected & (column == tabla.getSelectedColumn())) {
setForeground(table.getSelectionForeground());
setBackground(table.getSelectionBackground());
} else {
setForeground(table.getForeground());
setBackground(table.getBackground());
}
setSelected((value != null && ((Boolean) value).booleanValue()));
return this;
}
}
Debemos definir también una clase que permita asignar un Renderer a la fila y columna que le indiquemos:
class EachRowRenderer implements TableCellRenderer {
protected Hashtable renderers;
protected TableCellRenderer renderer, defaultRenderer;
public EachRowRenderer() {
renderers = new Hashtable();
defaultRenderer = new DefaultTableCellRenderer();
}
public void add(int row, TableCellRenderer renderer) {
renderers.put(new Integer(row), renderer);
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
renderer = (TableCellRenderer) renderers.get(new Integer(row));
if (renderer == null) {
renderer = defaultRenderer;
}
return renderer.getTableCellRendererComponent(table, value, isSelected,
hasFocus, row, column);
}
}
se puede hacer algo parecido con una tabla dinámica?
ResponderEliminarSi, podes tomar los datos de una consulta sql e implementar un TableCellRenderer segun el tipo de datos que necesites.
ResponderEliminarexacto, por ahi vienen los tiros. Tengo una tabla que se carga a partir de una sql y estoy necesitando una columna de checkboxes para hacer cosas con las filas, por ejemplo sumar valores de las filas marcadas o eliminarlas.
EliminarEstuve experimentando con cosas como:
TableColumn sportColumn = tablaDeudas.getColumnModel().getColumn(3);
JCheckBox cheqBox = new JCheckBox();
sportColumn.setCellEditor(new DefaultCellEditor(cheqBox));
Y en lugar del checkbox me aparece false, pero si hago click en la columna de la tabla si sale el checkbox.
Voy a estudiar tu código y el tema del TableCellRenderer, a ver que sale.
Tendrías que agregar en el CellEditorListener dentro del método editingStopped(ChangeEvent e) que es lo que deseas hacer cuando se haga clic en el checkbox.
EliminarEn la tercera parte del post sobre esto, podes descargarte un ejemplo. Y utilizando la clase JDBCAdapter y un poco de maña podes lograr lo que buscas.
http://www.ayudacomputadoras.com.ar/2012/06/jtable-con-checkbox-parte-iii.html
Gracias Guillermo, pero podrias subir el archivo del ejemplo de nuevo?, porque lo bajé y es un archivo sin extensión y el contenido parece estar corrupto.
EliminarEureka, Eureaka!! ya quedó!!
EliminarTuve que añadir 2 clases:
class CELL_RENDERER extends JCheckBox implements TableCellRenderer{
public Component getTableCellRendererComponent(JTable arg0, Object value, boolean arg2, boolean arg3, int arg4, int arg5) {
setSelected((value != null && ((Boolean) value).booleanValue()));
setBackground(arg0.getBackground());
setHorizontalAlignment(JLabel.CENTER);
return this;
}
}
class CELL_EDITOR extends DefaultCellEditor{
public CELL_EDITOR(JCheckBox checkBox) {
super(checkBox);
checkBox.setHorizontalAlignment(JLabel.CENTER);
}
}
(disculpas por la indentación, je)
y luego:
tabla.getColumnModel().getColumn(3).setCellRenderer(new CELL_RENDERER());
tabla.getColumnModel().getColumn(3).setCellEditor(new CELL_EDITOR(new JCheckBox()));
De esa manera la 3er columna de mi tabla queda con los dichosos checkboxes.
Un saludo desde Uruguay, y gracias por tu post!!, me ayudó a encontrar la lógica de la tabla con checkboxes :)
Me alegro mucho, que te haya servido. Saludos.
Eliminar