Como deixar apenas uma coluna da Jtable editável

Olá a todos, estou bem confuso com a implementação das minhas jtables no meu sistema, criei uma tablemodel para preencher a jtable com dados do banco de dados, porém eu estou com uma dúvida que não estou conseguindo sanar lendo os artigos na internet e gostaria que alguém pudesse me auxiliar ou me mostrar o caminho que devo seguir já que estou bem confuso com relação a personalizar minha tablemodel. Preciso que alem de preencher a tabela com banco de dados ela deixa apenas uma das colunas editaveis, ja consegui deixar todas editaveis e nenhuma editável mas apenas uma ainda não consegui. minha TableModel é simples e esta assim:

package br.com.logos.Model;

import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;

public class ProdSearch extends AbstractTableModel{
private ArrayList rows = null;
private String[] Cols = null;
private List<Boolean[]> editableCells;

public ProdSearch(ArrayList linhas, String[] Colunas){
    setRows(linhas);
    setCols(Colunas);
}

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

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

@Override
public Object getValueAt(int rowNum, int colNum) {
    Object[] linha = (Object[]) getRows().get(rowNum);
    return linha[colNum];
}
@Override
public String getColumnName(int arg0){
    return Cols[arg0];
}

public ArrayList getRows() {
    return rows;
}

public void setRows(ArrayList rows) {
    this.rows = rows;
}

public String[] getCols() {
    return Cols;
}

public void setCols(String[] Cols) {
    this.Cols = Cols;
}

}

E quando chamo a Jtable apenas seto o tamanho das colunas e insiro dados assim:

public void PreencherTabelaVenda(){
int LinhaSelecionada = TableVenda.getSelectedRow();
ArrayList dados = new ArrayList();
String[] Colunas = new String[]{“Cód.”, “Descrição”, “Quantidade”, “Valor unitário”, “Valor Total”};
String sql2 = “SELECT * FROM tab_prod_venda WHERE pedido =”+LblPed.getText();
try {
PreparedStatement pstm = con.prepareStatement(sql2);
ResultSet Rs = pstm.executeQuery();
if(Rs.first()){
do {
dados.add(new Object[]{Rs.getInt(“cod”), Rs.getString(“descricao”), Rs.getInt(“quantidade”), Rs.getDouble(“valorunit”), Rs.getDouble(“valortotal”)});
} while (Rs.next());
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Erro ao preencher tabela com produtos da venda: "+e);
}
ProdSearch model = new ProdSearch(dados, Colunas);
TableVenda.setModel(model);
TableVenda.getColumnModel().getColumn(0).setPreferredWidth(10);
TableVenda.getColumnModel().getColumn(1).setPreferredWidth(300);
TableVenda.getColumnModel().getColumn(2).setPreferredWidth(35);
TableVenda.getColumnModel().getColumn(3).setPreferredWidth(35);
TableVenda.getColumnModel().getColumn(4).setPreferredWidth(35);
model.fireTableDataChanged();

}

Gostaria de deixar a coluna com o campo quantidade editável para que eu possa alterar a quantidade e que após a alteração eu tenha um método que calcule o valor X a nova quantidade e já faça o update no banco.
Grato desde já!

No seu TableModel, sobrescreva o método isCellEditable.
https://docs.oracle.com/javase/7/docs/api/javax/swing/table/TableModel.html#isCellEditable(int,%20int)

Fiz isso, coloquei o dentro do model:
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return editableCells.get(rowIndex)[columnIndex];
}
Mas quando coloco deixa todas as colunas editáveis e eu queria apenas uma coluna da Jtable. Onde estou errando?

fiz da seguinte forma:
public boolean isCellEditable(int rowIndex, int columnIndex) {
Boolean b = false;
if(columnIndex == 2){
b = true;
return true;
}else{
b = false;
}
return b;

}

para que permitisse apenas que a coluna de indice 2 ficasse editável. Minha dúvida agora é em criar um evento para que essa celula editável aceite apenas números, e criar um evento que ja insira no banco um update mudando o valor que era para o novo valor, ja que minha tabela apenas estava resgatando valores inseridos diretamente no banco de dados.

public boolean isCellEditable(int rowIndex, int columnIndex) {
    return columnIndex == indiceDaColunaEditavel;
}
1 curtida