Jtable implementação setValueAt para objeto salvar para campo checkBox

pessoal, peço antecipadamente desculpa pela minha ignorância, mas estou começando em programação JAVA (antes VBA EXCEL , basico) e estou com problema em implementar a alteração num JTABLE , quando altero um campo (checkbox). Ele altera o visual mas não grava a alteração. Confesso que faz 3 dias que leio, vejo artigos releio… acho que é uma coisa simples, mas para mim ficou absurdamente extressante…
Implementei a AbstractTableModel… (vide codigo abaixo):

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


public class modeloTabelaCheckBox extends AbstractTableModel{ 
private ArrayList linhas = null; 
private String[] colunas = null; 


public modeloTabelaCheckBox(ArrayList lin, String[] col){ 
setLinhas(lin); // jogo o array preenchido para a variavel linhas -> metodo set abaixo.... 
setColunas(col); // seta o total de colunas para variavel colunas -> metodo set abaixo 
} 
public void setColunas(String[] nomes) { 
this.colunas = nomes; 
} 
public void setLinhas(ArrayList dados) { 
this.linhas = dados; 
} 
@Override 
public Class getColumnClass(int c) { 
/* Class klass = String.class; 
if (column == 0){ 
klass = Boolean.class; 
return klass; 
}*/ 
return getValueAt(0,c).getClass(); 

} 
@Override 
public boolean isCellEditable(int row, int column) { 
return column == 0; 
} 
public ArrayList getLinhas() { // 
return linhas; 
} 
public String[] getColunas() { 
return colunas; 
} 
@Override 
public int getColumnCount(){ 
return colunas.length; // conta o tamanhode colunas ... 
} 
@Override 
public int getRowCount(){ 
return linhas.size(); // conta o tamanho do array 
} 
@Override 
public String getColumnName(int numCol){ // pega o nome da coluna.... através do numero da coluna... 
return colunas[numCol]; // retorna o nome da coluna.... 
} 
@Override 
public Object getValueAt(int numLin, int numCol){ // retorn 
Object[] linha = (Object[])getLinhas().get(numLin); 
return linha[numCol]; 
} 
public void setValueAt(Object valor, int numLin, int numCol){ ////// ESTE É O METODO QUE PRECISO FAZER , alterar o campo booleano na table ..... 
????? /// um campo checkbox.... 
// boolean selecao = (boolean)this.getValueAt(numLin, numCol); 
if( (boolean) valor == false){ 
valor = true; 

} 
???? 
fireTableCellUpdated(numLin, numCol); 
???? 
} 

} 

Aqui é onde eu preencho a Table e a chamo … (codigo abaixo … )

private void preencherTabelaReceita(String sql){
ArrayList dados = new ArrayList();
String[] colunas = new String[]{“Sel:”,“Reg:”,“Medicamento”, “Quantidade :”, “Unidade:”, “Forma de Uso:”,“Posologia:”, “Port.:”};
Statement stm = null;
ResultSet rs = null;
try {
conexao.conecta(1); // 1 quer dizer medconBD1 e 0 - medconBD
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Erro ao acessar BDados!\n " + ex);
}
try {
stm = conexao.conn.createStatement();
rs = stm.executeQuery(sql);
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "ERRO COMANDOS SQL !\n " + ex);
}

try {
if (rs.next()) {

do {
dados.add(new Object[]{false, rs.getInt(“id_receitas”,rs.getString(“nome_remedio”, rs.getString(“qtdade”, rs.getString(“unidade”,
rs.getString(“posologia”, rs.getString(“posologia1”,rs.getString(“Portaria”});
} while (rs.next());
}
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Erro preenchimento ARRAY ! \n " + ex);
}
conexao.desconecta();
stm = null;
rs = null;
modeloTabelaCheckBox modelo = new modeloTabelaCheckBox(dados, colunas);
tbl_Receita.setModel(modelo);
tbl_Receita.getColumnModel().getColumn(0).setPreferredWidth(60);
tbl_Receita.getColumnModel().getColumn(0).setResizable(false);
tbl_Receita.getColumnModel().getColumn(1).setPreferredWidth(60);
tbl_Receita.getColumnModel().getColumn(1).setResizable(false);
tbl_Receita.getColumnModel().getColumn(2).setPreferredWidth(220);
tbl_Receita.getColumnModel().getColumn(2).setResizable(false);
tbl_Receita.getColumnModel().getColumn(3).setPreferredWidth(90);
tbl_Receita.getColumnModel().getColumn(3).setResizable(false);
tbl_Receita.getColumnModel().getColumn(4).setPreferredWidth(70);
tbl_Receita.getColumnModel().getColumn(4).setResizable(false);
tbl_Receita.getColumnModel().getColumn(5).setPreferredWidth(190);
tbl_Receita.getColumnModel().getColumn(5).setResizable(false);
tbl_Receita.getColumnModel().getColumn(6).setPreferredWidth(190);
tbl_Receita.getColumnModel().getColumn(6).setResizable(false);
tbl_Receita.getColumnModel().getColumn(7).setPreferredWidth(70);
tbl_Receita.getColumnModel().getColumn(7).setResizable(false);

Se uma santa alma puder me ajudar nesta implementação fico grato !!!

Nelson, nao consegui entender muito bem o seu codigo. Mas a forma que utilizei para trabalhar com JCheckBox foi a seguinte:

//Classe de Visão do Formulário

Criei uma variavel para receber o valor e depois mandar a informação pro banco:
int tipo_0;

depois fiz o seguinte comando quando for salvar o cadastro:

if (JCheckBox.isSelected() == true) {
tipo_0 = 1;
} else {
tipo_0 = 0;
}

// Enviando informações pra classe modelo
mod.settipo(tipo_0);

//chamando a classe controle para inserção no banco
control.inserir(mod);

///////////////////////

Ola Adriano,
então na verdade não preciso nem salvar isto em banco de Dados o que preciso mesmo é que a minha tabela , seja atualizada para posteriormente poder pegar estes campos que foram validados…
meu problema esta em atualizar a tabela que foi preenchida através de uma arraylist…
mas estou me perdendo em como fazer esta atualização para que tabela fique atualizada após ser clicado a celula 0 onde esta boolean … verdadeiro ou falso (um checkbox)…
valeu pela dica !

Você teria que fazer algo como:

public void setValueAt(Object valor, int numLin, int numCol){
     Object[] linha = linhas[numLin];
     linha[numCol] = valor;
}

Provavelmente isso vai funcionar, mas no caso, você está usando o AbstractTableModel de um jeito MUITO errado. Da forma que você está usando, não há qualquer vantagem sobre o DefaultTableModel. Se for para usar assim, use o próprio Default que já tem tudo isso pronto.

Se for querer aprender a usar o AbstractTableModel de fato, o ideal é que no interior do seu ArrayList tenha** a sua classe de negócios**. Assim evita que você tenha que desmembrar seu objeto sempre que for usar uma tabela ou que a informação de uma coluna que precisa ser oculta se perca, entre outras dores de cabeça.

Valeu Vini , era exatemente este detalhe de atribuição e desmembramento do objeto que estava perdido.
Realmente sua dica de trabalhar um classe de negócios tem tudo a ver , vi varios exemplos desta maneira, irei mudar para os próximos pois assim, fica mais facil utilizar os sets…
Agradeço pela ajuda Abraço !!!

olá viniGodoy peço que me ajude em problema de jTable em um topico que abrir e ainda não consegui resolver peço por favor de der uma olhada se possivel… segue o link meu topico

Oi. Não altere o título do tópico para resolvido. Ao invés disso, marque a resposta que te ajudou como solução do tópico. Nesse aqui, já fiz isso para você.

1 curtida

Nelson,
como vc usou o codigo que o Vini te passou?
estou com o mesmo problema que vc teve…
tentei implementar o setValueAt, mais ele da um erro na linha do “Object[] linha = linhas[numLin];”

o erro é: Array required, but arraylist found

Olá !!!
meio que usei e não usei , faz tanto tempo que não me lembro , mas aproveitei um pouco do que ele passou e
acabou funcionando.
ficou assim…

public String getColumnName(int numCol){ // pega o nome da coluna.... através do numero da coluna...
    return colunas[numCol]; // retorna o nome da coluna....
}
@Override
public Object getValueAt(int numLin, int numCol){ 
    Object[] linha = (Object[])getLinhas().get(numLin);
    return linha[numCol];
}   
@Override
public void setValueAt(Object valor, int numLin, int numCol){       
    
     Object[] linha = (Object[]) linhas.get(numLin);
     linha[numCol] = valor;
}    

}