RESOLVIDO: Jatble com Jcombobox: Update ao alterar dados da célula

Pessoal, estou precisando de ajuda…

Possuo uma Jtable e já consegui implementar um update caso eu altere uma célula da Jtable, porém gostaria de fazer isso numa célula que contenha um Jcombobox, também já consegui implementar o Jcombobox na célula mas agora ao realizar a seleção de um novo valor na célula do Jcombobox não consigo realizar o update, abaixo a estrutura do meu código:

Minha tela que possui a Jtable e a coluna “Status” onde tem o Jcombobox:

Método update que se encontra dentro da classe DAO que fará a alteração no BD MySQL:

public boolean update(String valores, String id) {
        com.mysql.jdbc.Connection conn = Conexao.getConnection();
        boolean res = false;
        String q = " UPDATE prioridade SET " + valores + " WHERE boCod= " + id;
        try {
            PreparedStatement pstm = conn.prepareStatement(q);
            pstm.execute();
            pstm.close();
            res = true;
        } catch (SQLException e) {
            System.out.println(e);
        }
        return res;
    }

Classe que faz todo processo de capturar os dados alterados na célula da Jtable e passa para o método update acima da classe DAO:

import java.awt.Component;
import javax.swing.AbstractCellEditor;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableCellEditor;

/**
 * @author Fabio
 */
public class JtableEditor extends AbstractCellEditor implements TableCellEditor {

    private PrioridadeDAO db;
    private String valorAntigo = ""; //Valor antigo da célula
    private String valorNovo = ""; //valor novo da célula
    private String nomeColuna = "";//Nome da coluna
    private String ID = "";// ID do registro a ser alterado
    private JComponent component = new JTextField();

    public JtableEditor(PrioridadeDAO db, String NomeColuna) {
        this.db = db;
        this.nomeColuna = NomeColuna;
    }

    public Object getCellEditorValue() {
        return ((JTextField) component).getText();
    }

    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        valorAntigo = value.toString();//Pega o valor da célula antes de qualquer alteração
        ID = table.getValueAt(row, 0).toString();//Pega o ID do registro a ser alterado
        ((JTextField) component).setText(value.toString());//Coloca o valor na célula alterada
        return component;
    }

    @Override
    public boolean stopCellEditing() {
        valorNovo = (String) getCellEditorValue();//Captura o novo valor da célula
        //Compara os valores, se são iguais não faz nada, se são diferentes chama o método Update
        if (!valorNovo.equals(valorAntigo)) { //Realiza o update (que esta na classe DAO)
            if (!db.update(nomeColuna + "='" + valorNovo + "' ", ID)) {//Verifica se possui erro
                JOptionPane.showMessageDialog(null, "Erro ao atualizar!");
                ((JTextField) component).setText(valorAntigo);
            }
        }
        return super.stopCellEditing();
    }
}

Minha Jtable que está no formulário, aqui carrego a Jtable já populando os dados da tabela, implemento o Jcombobox na coluna status (coluna 3) e chamo a classe que faz a captura dos dados alterados na celula para realizar o update no MySql (Comentários abaixo ver ******************):

//Carregar JTable Geral
    public void carregaPrioridade() {//Somente registros boVisivel = 1
        limpaCampos();
        PrioridadeDAO prioridadeDAO = new PrioridadeDAO();
        List<Prioridade> listaPrioridade = prioridadeDAO.obterTabela();
        Object colunas[] = {"Código",
            "Data de Abertura",
            "Data de Finalizacao",
            "Status",
            "Part Number",
            "Descrição",
            "Qtde",
            "Valor do BO",
            "Observação"};
        ((DefaultTableCellRenderer) jTablePrioridade.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(SwingConstants.CENTER);//Centraliza o cabeçalho
        DefaultTableModel model;
        model = new DefaultTableModel(colunas, 0) {
            @Override
            public boolean isCellEditable(int row, int col) {
                //Implementando o Jcombobox na célula da coluna Status (coluna 3) ************************************* 
                // Obtendo à referencia para a coluna 3 da tabela (status)
                TableColumn column = jTablePrioridade.getColumnModel().getColumn(3);
                // Criando o ComboBox
                JComboBox comboStatus = new JComboBox();
                // Definindo os valores para o ComboBox
                DefaultComboBoxModel comboModel = new DefaultComboBoxModel(new String[]{"", "Pendente", "Iniciado", "Finalizado"});
                comboStatus.setModel(comboModel);
                // Associando o ComboBox para a coluna
                column.setCellEditor(new DefaultCellEditor(comboStatus));
                //Deixando com aparência de editavel
                //comboStatus.setEditable(true);
                return true;
            }
        };
        for (Prioridade prioridade : listaPrioridade) {
            Object row[] = {
                prioridade.getBoCod(),//0
                prioridade.getBoAbertura(),//1
                prioridade.getBoFinalizacao(),//2
                prioridade.getBoStatus(),//3
                prioridade.getBoPN(),//4
                prioridade.getBoDescricao(),//5 
                prioridade.getBoQtde(),//6
                NFC.format(prioridade.getBoValor()),//7
                prioridade.getBoObs()//8
            };
            model.addRow(row);
        }
        jTablePrioridade.setModel(model);
        jTablePrioridade.getColumnModel().getColumn(0).setMinWidth(0);//Ocultando a coluna Cod
        jTablePrioridade.getTableHeader().getColumnModel().getColumn(0).setMaxWidth(0);//Ocultando a coluna Cod        
        txtLinhas.setText(String.valueOf(jTablePrioridade.getModel().getRowCount()));
        jTablePrioridade.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value,
                    boolean isSelected, boolean hasFocus, int row, int column) {
                super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                //A coluna do status é 3
                Object ref = table.getValueAt(row, 3);
                //Coloca cor em todas as linhas,COLUNA(3)
                if (ref != null && ref.equals("Pendente") || ref.equals("")) {
                    setHorizontalAlignment(JLabel.CENTER);
                    setBackground(new Color(255, 211, 211));//Vermelho
                    setForeground(Color.BLACK);
                } else if (ref.equals("Iniciado")) {
                    setHorizontalAlignment(JLabel.CENTER);
                    setBackground(new Color(255, 255, 204));//Amarelo
                    setForeground(Color.RED);
                } else if (ref.equals("Finalizado")) {
                    setHorizontalAlignment(JLabel.CENTER);
                    setBackground(new Color(204, 255, 204));//Verde
                    setForeground(Color.BLACK);
                } else {
                    boolean sel = isSelected;
                    if (sel == true) {
                        setHorizontalAlignment(JLabel.CENTER);
                        setBackground(getBackground());
                        setForeground(getForeground());
                    } else {
                        setHorizontalAlignment(JLabel.CENTER);
                        setBackground(Color.WHITE);
                        setForeground(new Color(51, 51, 51));
                    }
                }
                return this;
            }
        }
        );
        //Update ao editar celula Status e Observações **************************************
        jTablePrioridade.getColumnModel().getColumn(3).setCellEditor(new JtableEditor(prioridadeDAO, "boStatus"));//Columna Edad
        jTablePrioridade.getColumnModel().getColumn(8).setCellEditor(new JtableEditor(prioridadeDAO, "boObs"));//Columna Edad

        //Habilita o botão excluir
        btnExcluir.setEnabled(false);
    }

Bom se eu não implemento o Jcombobox na Jtable todos os updates funcionam perfeitamente ao realizar a alteração na celula Status, agora quando implemento o Jcombobox faço a alteração do valor na celula status mas não realiza o update.

já tentou um “pst.executeUpdate();”?

(Interface tá lindona, parabéns)

Obrigado @rodriguesabner mas resolvi de outra forma, excluindo todo essa classe ai em cima e apenas criei um método, abaixo a solução:

// Update conforme alteração na célula do Jtable
    private void UpdateTabela(int intRows, int intColumn) throws SQLException {
        Connection conn = Conexao.getConnection();
        Statement st = conn.createStatement();
        try {
            //st = conn.createStatement();
            String boCod = jTablePrioridade.getValueAt(intRows, 0).toString();
            String boAbertura = jTablePrioridade.getValueAt(intRows, 1).toString();
            String boFinalizacao = jTablePrioridade.getValueAt(intRows, 2).toString();
            String boStatus = jTablePrioridade.getValueAt(intRows, 3).toString();
            String boPN = jTablePrioridade.getValueAt(intRows, 4).toString();
            String boDescricao = jTablePrioridade.getValueAt(intRows, 5).toString();
            String boQtde = jTablePrioridade.getValueAt(intRows, 6).toString();
            String boValor = jTablePrioridade.getValueAt(intRows, 7).toString().replace("R$", "").replace(".", "").replace(",", ".");
            String boObs = jTablePrioridade.getValueAt(intRows, 8).toString();
            String sql = "UPDATE prioridade SET "
                    + "boAbertura = '" + boAbertura + "', "
                    + "boFinalizacao = '" + boFinalizacao + "', "
                    + "boStatus = '" + boStatus + "', "
                    + "boPN = '" + boPN + "', "
                    + "boDescricao = '" + boDescricao + "', "
                    + "boQtde = '" + Integer.parseInt(boQtde) + "', "
                    + "boValor = '" + Double.valueOf(boValor) + "', "
                    + "boObs = '" + boObs + "' "
                    + "WHERE boCod = '" + boCod + "' ";
            st.execute(sql);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao alterar: " + e.getMessage());
            e.printStackTrace();
        }
        try {
            if (st != null) {
                st.close();
                conn.close();
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }

E lá na construção da jTable chamo o método acima, ver abaixo nos comentários:

//Carregar JTable Geral
    public void carregaPrioridade() {//Somente registros boVisivel = 1
        limpaCampos();
        PrioridadeDAO prioridadeDAO = new PrioridadeDAO();
        List<Prioridade> listaPrioridade = prioridadeDAO.obterTabela();
        Object colunas[] = {"Código",
            "Data de Abertura",
            "Data de Finalizacao",
            "Status",
            "Part Number",
            "Descrição",
            "Qtde",
            "Valor do BO",
            "Observação"};
        ((DefaultTableCellRenderer) jTablePrioridade.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(SwingConstants.CENTER);//Centraliza o cabeçalho
        DefaultTableModel model;
        model = new DefaultTableModel(colunas, 0) {
            @Override
            public boolean isCellEditable(int row, int col) {
                //Implementando Jcombobox na coluna 3 da tabela (status)
                TableColumn column = jTablePrioridade.getColumnModel().getColumn(3);
                JComboBox comboStatus = new JComboBox();
                DefaultComboBoxModel comboModel = new DefaultComboBoxModel(new String[]{"Pendente", "Iniciado", "Finalizado"});
                comboStatus.setModel(comboModel);
                column.setCellEditor(new DefaultCellEditor(comboStatus));

                return true;
            }
        };
        for (Prioridade prioridade : listaPrioridade) {
            Object row[] = {
                prioridade.getBoCod(),//0
                prioridade.getBoAbertura(),//1
                prioridade.getBoFinalizacao(),//2
                prioridade.getBoStatus(),//3
                prioridade.getBoPN(),//4
                prioridade.getBoDescricao(),//5 
                prioridade.getBoQtde(),//6
                NFC.format(prioridade.getBoValor()),//7
                prioridade.getBoObs()//8
            };
            model.addRow(row);
        }
        jTablePrioridade.setModel(model);
        jTablePrioridade.getColumnModel().getColumn(0).setMinWidth(0);//Ocultando a coluna Cod
        jTablePrioridade.getTableHeader().getColumnModel().getColumn(0).setMaxWidth(0);//Ocultando a coluna Cod        
        txtLinhas.setText(String.valueOf(jTablePrioridade.getModel().getRowCount()));
        jTablePrioridade.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value,
                    boolean isSelected, boolean hasFocus, int row, int column) {
                super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                //A coluna do status é 3
                Object ref = table.getValueAt(row, 3);
                //Coloca cor em todas as linhas,COLUNA(3)
                if (ref != null && ref.equals("Pendente") || ref.equals("")) {
                    setHorizontalAlignment(JLabel.CENTER);
                    setBackground(new Color(255, 211, 211));//Vermelho
                    setForeground(Color.BLACK);
                } else if (ref.equals("Iniciado")) {
                    setHorizontalAlignment(JLabel.CENTER);
                    setBackground(new Color(255, 255, 204));//Amarelo
                    setForeground(Color.RED);
                } else if (ref.equals("Finalizado")) {
                    setHorizontalAlignment(JLabel.CENTER);
                    setBackground(new Color(204, 255, 204));//Verde
                    setForeground(Color.BLACK);
                } else {
                    boolean sel = isSelected;
                    if (sel == true) {
                        setHorizontalAlignment(JLabel.CENTER);
                        setBackground(getBackground());
                        setForeground(getForeground());
                    } else {
                        setHorizontalAlignment(JLabel.CENTER);
                        setBackground(Color.WHITE);
                        setForeground(new Color(51, 51, 51));
                    }
                }
                return this;
            }
        }
        );

        //Update ao editar celula
        jTablePrioridade.getModel().addTableModelListener(new TableModelListener() {
            public void tableChanged(TableModelEvent e) {
                if (e.getType() == (TableModelEvent.UPDATE)) {
                    try {
                        int intColumn = e.getColumn();
                        int intRows = e.getFirstRow();
                        UpdateTabela(intRows, intColumn); // Update
                    } catch (SQLException ex) {
                        Logger.getLogger(formPrioridade.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        });

        //Habilita o botão excluir
        btnExcluir.setEnabled(false);
    }
1 curtida