Código:
  
el codigo de la definicion de tabla es el siguiente this.jtblDetalle.getModel().addTableModelListener(new TableModelListener() {
            @Override
            public void tableChanged(TableModelEvent e) {
                
                if ( e.getType() == TableModelEvent.UPDATE ) {
                    TableModel modelo = ( (TableModel) ( e.getSource() ) );            
                    int fila = e.getFirstRow();
                    int columna = e.getColumn();
               System.out.println("fila "+fila+" columna "+columna);
 
                    
                }
             
            }
        });
Código:
  
como puedo hacer para que desde AbstractTableModel  pueda seleccionar bien el numero de columna public class DetalleTableModel extends  AbstractTableModel {
    
    Validator v;
    public boolean opcion = false;
    private ArrayList<ArrayDetalle> listaDetalle;
    private Class[] tipoColumnas = {Object.class, JTextField.class, java.lang.Integer.class, java.lang.Double.class, java.lang.Double.class};
    
    private String[] columnas = {"Código", "Descripción","Cantidad", "Valor Unit.", "Valor Total"};
    private boolean[] editables={true,true,true,false,false};
    public FacturaTableModel() {
        this.listaDetalle = new ArrayList<ArrayDetalle>();
    }
    public void addFacturaDetalle(ArrayDetalle objDetalle) {
        this.listaDetalle.add(objDetalle);
        fireTableDataChanged();
    }
    public void removerFacturaDetalle(int rowIndex) {
        this.listaDetalle.remove(rowIndex);
        fireTableDataChanged();
    }
    @Override
    public int getRowCount() {
        return this.listaDetalle.size();
    }
 
    @Override
    public int getColumnCount() {
        return columnas.length;
    }
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        switch (columnIndex) {
            case 0:
                return this.listaDetalle.get(rowIndex).getCodProducto();
            case 1:
                return this.listaDetalle.get(rowIndex).getDesProducto();
            case 2:
                return this.listaDetalle.get(rowIndex).getCantidad();
            case 3:
                return this.listaDetalle.get(rowIndex).getPrecio();
            case 4:
                return this.listaDetalle.get(rowIndex).getPrecioTotal();
            default:
                return this.listaDetalle.get(rowIndex);
        }
    }
    @Override
    public void setValueAt(Object value, int rowIndex, int columnIndex) {
        super.setValueAt(value, rowIndex, columnIndex);
        switch (columnIndex) {
            case 0:
                this.listaDetalle.get(rowIndex).setCodProducto(String.valueOf(value));
                break;
            case 1:
                this.listaDetalle.get(rowIndex).setDesProducto(String.valueOf(value));
                break;
            case 2:
                this.listaDetalle.get(rowIndex).setCantidad(Integer.parseInt(value.toString()));
               
                
                break;
            case 3:
                this.listaDetalle.get(rowIndex).setPrecio(Double.parseDouble(value.toString()));
                break;
            case 4:
                  this.listaDetalle.get(rowIndex).setPrecioTotal(Double.parseDouble(value.toString()));
                  break;
            
        }
        
        fireTableDataChanged(); 
    } 
    @Override
    public String getColumnName(int columnIndex) {
        return this.columnas[columnIndex];
    }
    @Override
 
    public Class<?> getColumnClass(int columnIndex) {
        return tipoColumnas[columnIndex];
    }
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
 
         return editables[columnIndex];
    }
    
    public TableCellEditor getCellEditor(int rowIndex,int columnIndex) {
        final JTextField field = new JTextField(getValueAt(rowIndex,columnIndex).toString());
        final DefaultCellEditor edit = new DefaultCellEditor(field);
        edit.setClickCountToStart(2);
        field.addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(FocusEvent e) {
                field.selectAll();//Con esto al solicitar el editor, el texto queda seleccionado
                
            }
            @Override
            public void focusLost(FocusEvent e) {
                field.select(0,0);//De-selecciono el texto al perder el foco.
                 
            }
        });
        
        return edit;
    }
   
   
    
}
 
 


