Como deixar apenas uma coluna da Jtable editável

4 respostas Resolvido
jtableprogramaçãojavamysql
G

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á!

4 Respostas

S

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

G
Fiz isso, coloquei o dentro do model:

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

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?
G
Solucao aceita
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.

S
public boolean isCellEditable(int rowIndex, int columnIndex) {
    return columnIndex == indiceDaColunaEditavel;
}
Criado 25 de maio de 2018
Ultima resposta 26 de mai. de 2018
Respostas 4
Participantes 2