JTable - Coluna Int

6 respostas
S

Eae Galera, beleza?

Estou tendo um problema com colunas que são inteiros no JTable, no meu TableModel o isCellEditable está como para ser editável, mas quando eu executo o sistema e ponho para adicionar uma nova linha em branco, eu não consigo editar, somente campos que são Strings. Aqui está meu isCellEditable:

public boolean isCellEditable(int rowIndex, int columnIndex) { switch (columnIndex) { case 0: //Codigo do Item return true; case 1: //Descrição do Item return false; default: return false; }

Aqui está minha função de adicionar uma linha:

public void addItemVendaOrcamento(Itens_VendaOrcamento item) { // Adiciona o registro. listaItens.add(item); int ultimoIndice = getRowCount() - 1; fireTableRowsInserted(ultimoIndice, ultimoIndice); }

Quando eu chamo a função: `modeloItensVendaOrcamento.addItemVendaOrcamento(new Itens_VendaOrcamento()); na minha tela, o campo inteiro que é o código do item, não consigo editar, como se tivesse travado a célula. Já refiz umas 2 ou 3 tablemodels diferentes, mas nada funciona. Alguém já teve esse problema?

Obrigado`

6 Respostas

T

Opa amigo, você sobrescreveu o método getColumnClass(int columnIndex) ? Esse método vai retornar o tipo de dado associado a coluna especificada.

S

Eae Thiago,

Sim esta normal

` <a class="mention" href="/u/override">@Override</a>

public Class<?> getColumnClass(int columnIndex) {

switch (columnIndex) {

case COLUNA_COD_ITEM:

return int.class;

case COLUNA_DESC_ITEM:

return String.class;

default:

throw new IndexOutOfBoundsException(“columnIndex out of bounds”);

}

Mas quando eu executo o programa, como na imagem, eu clico na coluna codigo do item e não me deixa alterar.

`

Basicamente, quando eu clico no botao novo, adiciona uma linha e o usuario modifica os campos, a descrição consigo fazer funcionar, mas o código não.

T

Cola o código do tablemodel , caso tenha lançado alguma excessão cola aí tbm

S

Esse é o meu tablemodel

`public class ItensVendaOrcamento_TableModel extends AbstractTableModel{

private static final int COLUNA_COD_ITEM = 0;
private static final int COLUNA_DESC_ITEM = 1;
private static final int COLUNA_QTD_ITEM = 2;
private static final int COLUNA_VLR_UNITARIO = 3;
private static final int COLUNA_VLR_TOTAL = 4;
private static final int COLUNA_UN_MEDIDA = 5;
private static final int COLUNA_IPI = 6;
private static final int COLUNA_ICMS = 7;
private static final int COLUNA_ST = 8;
private static final int COLUNA_NCM = 9;

private List<Itens_VendaOrcamento> listaItens;

// Cria um ItensVendaOrcamento_TableModel sem nenhuma linha
public ItensVendaOrcamento_TableModel() {
    listaItens = new ArrayList<Itens_VendaOrcamento>();
}

// Cria um ItensVendaOrcamento_TableModel contendo a lista recebida por parâmetro
public ItensVendaOrcamento_TableModel(List<Itens_VendaOrcamento> listaDeItens) {
    listaItens = new ArrayList<Itens_VendaOrcamento>(listaDeItens);
} 

// Array com os nomes das colunas.
private final String[] colunas = new String[] { "Cod. Item", "Desc. Item", "Qtd. Item", "Vlr. Unitario", "Vlr. Total", 
                                          "Un. Medida", "IPI", "ICMS", "ST", "NCM" };

@Override
public int getRowCount() {
    return listaItens.size();
}

@Override
public int getColumnCount() {
    return colunas.length;
}

@Override
public String getColumnName(int columnIndex) {
    return colunas[columnIndex];
};

@Override
public Class<?> getColumnClass(int columnIndex) {
    switch (columnIndex) {
    case COLUNA_COD_ITEM:
        return int.class;
    case COLUNA_DESC_ITEM:
        return String.class;
    case COLUNA_QTD_ITEM:
        return int.class;
    case COLUNA_VLR_UNITARIO:
        return float.class;
    case COLUNA_VLR_TOTAL:
        return float.class;
    case COLUNA_UN_MEDIDA:
        return String.class;
    case COLUNA_IPI:
        return int.class;
    case COLUNA_ICMS:
        return int.class;
    case COLUNA_ST:
        return int.class;
    case COLUNA_NCM:
        return String.class;
    default:            
        throw new IndexOutOfBoundsException("columnIndex out of bounds");
    }
}

@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
    switch (columnIndex) {
        case 0: //Codigo do Item
         return true;
        case 1: //Descrição do Item
         return false;
        case 2: //Quantidade de Item
         return true;
        case 3: //Valor Unitario
         return true;
        case 4: //Valor Total
         return false;
        case 5: //Unidade de Medida
         return true;
        case 6: //IPI
         return true;
        case 7: //ICMS
         return true;
        case 8: //ST
         return true;
        case 9: //NCM
         return false;
        default:
         return false;
       }
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    // Pega o sócio referente a linha especificada.
    Itens_VendaOrcamento itens = listaItens.get(rowIndex);

    switch (columnIndex) {
        case COLUNA_COD_ITEM:
            return itens.getCod_item();
        case COLUNA_DESC_ITEM:
            return itens.getDesc_item();
        case COLUNA_QTD_ITEM:
            return itens.getQtd_item();
        case COLUNA_VLR_UNITARIO:
            return itens.getVlr_unitario();
        case COLUNA_VLR_TOTAL:
            return itens.getVlr_total();
        case COLUNA_UN_MEDIDA:
            return itens.getUn_medida();
        case COLUNA_IPI:
            return itens.getIpi();
        case COLUNA_ICMS:
            return itens.getIcms();
        case COLUNA_ST:
            return itens.getSt();
        case COLUNA_NCM:
            return itens.getNcm();
        default:            
            throw new IndexOutOfBoundsException("columnIndex out of bounds");
        }
}

@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    // Pega o sócio referente a linha especificada.
    Itens_VendaOrcamento itens = listaItens.get(rowIndex);

    switch (columnIndex) {
        case COLUNA_COD_ITEM:
            itens.setCod_item((int) aValue);
            break;
        case COLUNA_DESC_ITEM:
            itens.setDesc_item((String) aValue);
            break;
        case COLUNA_QTD_ITEM:
            itens.setQtd_item((int) aValue);
            break;
        case COLUNA_VLR_UNITARIO:
            itens.setVlr_unitario((float) aValue);
            break;
        case COLUNA_VLR_TOTAL:
            itens.setVlr_total((float) aValue);
            break;
        case COLUNA_UN_MEDIDA:
            itens.setUn_medida((String) aValue);
            break;
        case COLUNA_IPI:
            itens.setIpi((int) aValue);
            break;
        case COLUNA_ICMS:
            itens.setIcms((int) aValue);
            break;
        case COLUNA_ST:
            itens.setSt((int) aValue);
            break;
        case COLUNA_NCM:
            itens.setNcm((String) aValue);
            break;
        default:                
            throw new IndexOutOfBoundsException("columnIndex out of bounds");
        }
    fireTableCellUpdated(rowIndex, columnIndex); // Notifica a atualização da célula
}

// Retorna o item referente a linha especificada
public Itens_VendaOrcamento getItemVendaOrcamento(int indiceLinha) {
    return listaItens.get(indiceLinha);
}

// Adiciona o item especificado ao modelo
public void addItemVendaOrcamento(Itens_VendaOrcamento item) {
    // Adiciona o registro.
    listaItens.add(item);

    // Pega a quantidade de registros e subtrai 1 para
    // achar o último índice. A subtração é necessária
    // porque os índices começam em zero.
    int ultimoIndice = getRowCount() - 1;

    // Notifica a mudança.
    fireTableRowsInserted(ultimoIndice, ultimoIndice);
}

// Remove o sócio da linha especificada.
public void removeItemVendaOrcamento(int indiceLinha) {
    // Remove o registro.
    listaItens.remove(indiceLinha);

    // Notifica a mudança.
    fireTableRowsDeleted(indiceLinha, indiceLinha);
}

// Adiciona uma lista de itens no final da lista.
public void addListaDeItens(List<Itens_VendaOrcamento> itens) {
    // Pega o tamanho antigo da tabela, que servirá
    // como índice para o primeiro dos novos registros
    int indice = getRowCount();

    // Adiciona os registros.
    listaItens.addAll(itens);

    // Notifica a mudança.
    fireTableRowsInserted(indice, indice + itens.size());
}

// Remove todos os registros.
public void limpar() {
    // Remove todos os elementos da lista de itens.
    listaItens.clear();

    // Notifica a mudança.
    fireTableDataChanged();
}

}

Quando eu clico no botão novo, chamo essa função:

`modeloItensVendaOrcamento.addItemVendaOrcamento(new Itens_VendaOrcamento());``

ViniGodoy

Você deve retornar Integer.class e Float.class e não a dos tipos primitivos.

S

Muito Obrigado Vini.

Não acredito que era algo tão simples, 1 semana nesse erro e algo tão simples.

Muito Obrigado :smiley:

Criado 20 de fevereiro de 2016
Ultima resposta 24 de fev. de 2016
Respostas 6
Participantes 3