Ver Mensaje Individual
  #2 (permalink)  
Antiguo 03/02/2010, 14:48
Avatar de dackiller
dackiller
 
Fecha de Ingreso: septiembre-2003
Ubicación: The Matrix
Mensajes: 341
Antigüedad: 20 años, 8 meses
Puntos: 4
Respuesta: Cambiar el valor de una celda del JTable

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 rowIndexint columnIndex) {
        
Producto producto = (ProductoREGISTROS.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 aValueint rowIndexint columnIndex) {
        
Producto producto = (ProductoREGISTROS.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 rowIndexint 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.
__________________
--
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.