Hola, eso lo puedes hacer facilmente con un TableModel propio.
Puedes capturar cualquier dato que introduzcas en el JTable a traves del TableModel del JTable:
Exactamente tienes que extender tu TableModel de la clase
AbstractTableModel ejemplo:
Supongamos que creamos una Clase Producto para usarla como registro de cada fila del JTable.
Código PHP:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author Dackiller
*/
public class Producto {
private int cantidad;
private String codigo;
private String nombre;
private double precio;
private double total;
public int getCantidad() {
return cantidad;
}
public void setCantidad(int cantidad) {
this.cantidad = cantidad;
}
public String getCodigo() {
return codigo;
}
public void setCodigo(String codigo) {
this.codigo = codigo;
}
public double getPrecio() {
return precio;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public void setPrecio(double precio) {
this.precio = precio;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
}
Ahora creamos nuestro propio TableModel, que tendrá el metodo
setValueAt que nos permitirá modificar cualquier columna de un registro X
Código PHP:
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
/**
*
* @author Dackiller
*/
public class CustomTableModel extends AbstractTableModel {
private ArrayList REGISTROS = new ArrayList();
private String COLUMNAS[] = {"CODIGO","PRODUCTO","CANTIDAD","PRECIO","TOTAL"};
public int getColumnCount() {
return COLUMNAS.length;
}
public int getRowCount() {
return REGISTROS.size();
}
public Object getValueAt(int rowIndex, int columnIndex) {
Producto producto = (Producto) REGISTROS.get(rowIndex);
switch(columnIndex){
case 0:
return producto.getCodigo();
case 1:
return producto.getNombre();
case 2:
return producto.getCantidad();
case 3:
return producto.getPrecio();
case 4:
return producto.getTotal();
default:
return null;
}
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
Producto producto = (Producto) REGISTROS.get(rowIndex);
switch(columnIndex){
case 0:
producto.setCodigo(aValue.toString());
case 1:
producto.setNombre(aValue.toString());
case 2:
// Si la columna es "CANTIDAD", se actualiza el precio total automaticamente.
int nuevaCantidad = Integer.valueOf(aValue.toString());
producto.setCantidad(nuevaCantidad);
producto.setTotal(producto.getPrecio()*nuevaCantidad);
case 3:
producto.setPrecio(Double.valueOf(aValue.toString()));
case 4:
producto.getTotal();
}
// Disparamos el Evento TableDataChanged (La tabla ha cambiado)
fireTableDataChanged();
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
public void setProducto(Producto producto){
REGISTROS.add(producto);
fireTableDataChanged();
}
}
El metodo
isCellEditable le dice al JTable cuales columnas pueden ser Editadas, en este caso devolvemos
true para que todas las columnas sean editables, en caso que no quieras que todas sean editables tendrás que devolver
true dependiendo del columnIndex que deseas sea editable.
¿Como introducir un nuevo producto en el JTable desde el JFrame?
Código PHP:
Producto pro = new Producto();
pro.setCantidad(1);
pro.setCodigo("P001");
pro.setNombre("PRODUCTO PARA VENDER SIN COLOR NI TALLA, NI DESCRIPCION");
pro.setPrecio("1.00");
pro.setTotal("1.00");
((CustomTableModel)(JTable.getModel()).setProducto(pro);
Como veras, crear un TableModel propio te da mucha más libertad con los datos.
Espero esto pueda ayudarte...
Saludos.