Foros del Web » Programación para mayores de 30 ;) » Java »

Cambiar el valor de una celda del JTable

Estas en el tema de Cambiar el valor de una celda del JTable en el foro de Java en Foros del Web. Qué tal, he estado trabajando un poco en java y ahora me encuentro en un gran problema con el manejo un JTable. Mi problema es ...
  #1 (permalink)  
Antiguo 02/02/2010, 23:36
 
Fecha de Ingreso: febrero-2010
Mensajes: 2
Antigüedad: 14 años, 3 meses
Puntos: 0
Cambiar el valor de una celda del JTable

Qué tal, he estado trabajando un poco en java y ahora me encuentro en un gran problema con el manejo un JTable. Mi problema es el siguiente:

Estoy simulando una factura con un JTable, el cual contiene cuatro campos: Cantidad, Descripción, Precio Unitario e Importe. En la columna de Descripción tengo un combo box como editor y es editable, el cual está llenado con información de una base de datos, esta columna cuenta con la implementación de autocompletado, al seleccionar un elemento del combo por medio del mouse o por medio del teclado, es decir, al escribir y coincidir con algún elemento del combo y darle enter, quiero que en la celda de la columna Precio unitario se actualice un valor de acuerdo al elemento seleccionado sobre la misma fila.

En el campo Descripción, solo se puede escribir palabras que están dentro del combobox, así que siempre habrá una valor válido para la celda del precio unitario.

De antemano les agradezco y espero contar con su valiosa ayuda.
  #2 (permalink)  
Antiguo 03/02/2010, 14:48
Avatar de dackiller  
Fecha de Ingreso: septiembre-2003
Ubicación: The Matrix
Mensajes: 341
Antigüedad: 20 años, 7 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.
  #3 (permalink)  
Antiguo 08/02/2010, 21:38
 
Fecha de Ingreso: febrero-2010
Mensajes: 2
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Cambiar el valor de una celda del JTable

Qué tal mi estimado Dackiller, he probado y echado a andar tu prototipo, y tengo unas observaciones que hacerle.

Cualquier celda acepta números y cambia el contenido de las celdas, si le inserto un valor a la primera columna, las demás celdas del lado derecho cambian al mismo valor introducido. Me gustaría que tuviera un combo box y que fuese editable, y al primer match que encuentre editando el combo con el contenido del mismo, el valor de la celda contigua a la derecha, cambie su valor al que le corresponde sobre dicho item seleccionado.

Etiquetas: celda, jtable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:28.