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.