GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Como criar evento que ao mudar valor da celula da Jtable, faça um calculo e um update no banco de dados

mysql
java
sql
programação
jtable
Tags: #<Tag:0x00007f6651ee0980> #<Tag:0x00007f6651ee07f0> #<Tag:0x00007f6651ee06b0> #<Tag:0x00007f6651ee04d0> #<Tag:0x00007f6651ee0390>

#1

Estou com uma dúvida com relação a JTable e ao TableModel, até então meu sistema apenas preenchia as minhas Jtables com dados inseridos no banco, porém gostaria de fazer alteração direta na JTable e ja automaticamente alterar os valores diretamente no banco de dados, mas não sei como fazer, não sei se existe algum evento que dispararia esse valor alterado na celula da tabela e e resgataria esse novo valor inserido na celula para que eu pudesse usar para calcular novos valores e fazer um update na tabela do banco de dados para só então preencher novamente a JTable com os dados já alterados.
Meu tableModel:

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

public ProdVenda(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;
}

@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
    Boolean b = false;
    if(columnIndex == 2){
        b = true;
    return true;
    }else{
        b = false;
    }
    return b;
    
}

}

Meu formulário que preenche os dados na Tabela:

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);
}
ProdVenda model = new ProdVenda(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();

}

Como fazer, eu crio um evento na tabela? por favor me ajudem. O meu objetivo é poder alterar a quantidade de produtos diretamente na JTable e com isso alterar o valor total e o custo total.


#2

Primeiro de tudo vc sempre deve ir atrás da documentação para saber em que chão está pisando.
https://docs.oracle.com/javase/7/docs/api/javax/swing/table/AbstractTableModel.html

Lógica:
Método setValueAt(Object aValue, int rowIndex, int columnIndex) será chamado toda vez que um valor de uma célula mudar. Portanto se o sobrescrever poderá implementar sua lógica.


#3

ta mas onde eu disparo o setValueAt, esse método que preenche as tabelas ocorre sempre que aperto um botão, mas queria saber no mínimo fazer com que um JOptionPane.showMessageDialog me retornasse um valor que eu digitei na celula, o que não sei fazer é onde disparar esse evento. pq se consigo capturar o valor digitado eu conseguiria fazer a alteração no banco e calcular o total, mas não estou conseguindo colocar essa informação, parece que existe um meio também de colocar um textfield na célula da jtable, mas ainda estou muito confuso. Já cheguei a entender como funciona algumas funções do abstracttablemodel, o que não sei é onde usar para ficar correto. e não sei como usar o celleditor, estou tentando reunir algumas informações para tentar resolver esse meu problema. Quero usar cadastro de formas de pagamento e gostaria de uma celula de uma JTable trouxesse a descrição da forma de pagamento e outra trouxesse um campo para inserir valores com o total recebido, mas não esotu conseguindo implementar por falta de conhecimento.


#4

Observe oq eu disse, todas respostas estão ali. setValueAt é um MÉTODO, não evento, da classe AbstractTableModel que vc já está estendendo e precisa apenas SOBRESCREVE-LO assim como fez com o getValueAt, é a mesma lógica, mas com outro método.


#5

o problema é que não quero alterar apenas na Jtable, quero alterar que quando eu tirar o foco da tabela ele pegue o valor digitado, faça um calculo de totais e um update no tabela do banco e em seguida preencha novamente a JTable com as informações atualizadas. Tentei fazer um setValueAt para pegar o valor inserido e ele retorna o mesmo valor que já estava, achei que deveria fazer isso num listener, num keyevent e etc mas até agora sem sucesso.


#6

Ai é mais um evento.
Vc n vai conseguir um só que faça isso em n ocasiões e sempre vai ter uma situação não contemplada.
Ex.: se o processo for encerrado não há oq fazer.