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

8 respostas Resolvido
java
N

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

8 Respostas

A

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);

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

N

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 !

V
Solucao aceita

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.

N

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

A

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

V

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ê.

D

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

N

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;
}

}

Criado 28 de janeiro de 2016
Ultima resposta 19 de mar. de 2017
Respostas 8
Participantes 5