Ae galera to com um probleminha chatooo… faço a busca dos dados via banco para popular em uma JTable. Seu modelo eu implementei utilizando AbstraticTableModel. Quando busco os dados via banco ele tem que me retornar duas linhas de dados diferente Ex.: Linha1: João Linha2: Pedro, ele traz as duas linhas na JTable so que com os dados repetidos do ultimo registro buscado do banco dae fica Linha1 Pedro e Linha2 Pedro.
Abaixo o codigo que faz a busca no banco de dados e adiciona a linha:
publicvoidpopularJTable(ResultSetrs)throwsSQLException{linhas=newArrayList();modelo=newJTableModel(linhas,colunas);//Obtem os Meta dados do resultsetResultSetMetaDatarsmd=rs.getMetaData();String[]linhaNova=newString[rsmd.getColumnCount()];//Enquanto existir dadoswhile(rs.next()){for(inti=0;i<modelo.getColumnCount();i++){switch(rsmd.getColumnType(i+1)){caseTypes.INTEGER:linhaNova[i]=""+rs.getInt(rsmd.getColumnName(i+1));break;caseTypes.VARCHAR:linhaNova[i]=rs.getString(rsmd.getColumnName(i+1));break;}}modelo.addRow(linhaNova);}jTable.setModel(modelo);}
Agora o metodo que é responsavel por adicionar as linhas:
public void addRow(String[] dadosLinha){
getLinhas().add(dadosLinha);
int linha = getLinhas().size() -1;
fireTableRowsInserted(linha,linha);
}
Utilizo o tipo ArrayList para as linhas, estou começando a trabalhar agora com este tipo e não tenho muito conhecimento.
Coloca teu model aqui. Eu tive um problema parecido com esse, e era no model.
malves_info
Ta ae Brother!:
publicclassJTableModelextendsAbstractTableModel{privateArrayListlinhas;privateString[]colunas;publicJTableModel(ArrayListdados,String[]colunas){setLinhas(dados);setColunas(colunas);}//Retorna o numero de colunaspublicintgetColumnCount(){returngetColunas().length;}//Retorna o numero de linhaspublicintgetRowCount(){returngetLinhas().size();}//Obtem o valor da linhas e colunapublicObjectgetValueAt(introwIndex,intcolumnIndex){//Recebe a linha, passando por cast para String[]String[]linha=(String[])getLinhas().get(rowIndex);//Retorna o objeto na posição de columnIndexreturnlinha[columnIndex];}//Seta valor da linha e colunapublicvoidsetValueAt(Objectvalue,introwIndex,intcolumnIndex){String[]linha=(String[])getLinhas().get(rowIndex);//Altera o conteúdo da linha na posição do indice columnIndexlinha[columnIndex]=(String)value;//Dispara o evento da celula alteradafireTableCellUpdated(rowIndex,columnIndex);}//Adiciona nova linhapublicvoidaddRow(String[]dadosLinha){getLinhas().add(dadosLinha);//Informa ao JTable que ouve linhas incluidas no modelo//Como os dados são adicionados no final pega o tamanho total das linhas//menos 1 para obter a linha incluida.intlinha=getLinhas().size()-1;fireTableRowsInserted(linha,linha);}//Remove linhapublicbooleanremoveRow(Stringval,intcol){//obtem o iteratorIteratori=getLinhas().iterator();//Guarda as linhas percorridasintlinha=0;//Faz um loop enquando obtiver dadoswhile(i.hasNext()){//Obtem as colunas da linha atualString[]linhaCorrente=(String[])i.next();linha++;//Compara o valor da linha atual na coluna e valor //informado por parametroif(linhaCorrente[col].equals(val)){getLinhas().remove(linha);//informa a JTable que houve dados deletados //passando a linha removidafireTableRowsDeleted(linha,linha);returntrue;}}//Caso não encontre o valorreturnfalse;}//Retorna o nome da coluna//getColumnName[col] retorna na posição do indice! publicStringgetColumnName(intcol){returngetColunas()[col];}publicArrayListgetLinhas(){returnlinhas;}publicString[]getColunas(){returncolunas;}publicvoidsetLinhas(ArrayListdados){linhas=dados;}publicvoidsetColunas(String[]dados){colunas=dados;}}
Gobain
Quando eu tive um problema parecido, eu tava fazendo meu model com um Set, e todas as linhas saíam iguais.
Aqui tem a implementação com um ArrayList, que funciona 100%
publicclassClienteContasCorrentesTableModelextendsAbstractTableModel{privatefinalString[]columnNames=newString[]{"Nome do Banco","Número da Agência","Número da conta","Nome do Títular"};privatefinalClass[]types=newClass[]{String.class,String.class,String.class,String.class};privatefinalArrayList<ContaCorrente>contas=newArrayList<ContaCorrente>();publicClienteContasCorrentesTableModel(){super();}publicClienteContasCorrentesTableModel(Collection<ContaCorrente>valores){if(valores!=null)contas=newArrayList<ContaCorrente>(valores);}publicvoidaddRow(ContaCorrentecc){contas.add(cc);}publicClass<?>getColumnClass(intcolumnIndex){returntypes[columnIndex];}publicintgetColumnCount(){returnthis.columnNames.length;}publicStringgetColumnName(intcolumnIndex){returnthis.columnNames[columnIndex];}publicSetgetContasCorrentes(){Setccs=newHashSet();for(ContaCorrentecc:contas)ccs.add(cc);returnccs;}publicContaCorrentegetRow(introwIndex){returncontas.get(rowIndex);}publicintgetRowCount(){returnthis.contas.size();}publicObjectgetValueAt(introwIndex,intcolumnIndex){switch(columnIndex){case0:returncontas.get(rowIndex).getBanco().getCod_banco();case1:returncontas.get(rowIndex).getNum_agencia();case2:returncontas.get(rowIndex).getNum_conta_corrente();case3:returncontas.get(rowIndex).getNme_titular();default:returnnull;}}publicbooleanisCellEditable(introwIndex,intcolumnIndex){if(columnIndex>0){returntrue;}else{returnfalse;}}publicvoidremoveRow(introwIndex){contas.remove(rowIndex);fireTableDataChanged();}publicvoidsetValueAt(Objectvalue,introwIndex,intcolumnIndex){switch(columnIndex){case0:contas.get(rowIndex).setCod_banco(Integer.parseInt(value.toString()));break;case1:contas.get(rowIndex).setNum_agencia(value.toString());break;case2:contas.get(rowIndex).setNum_conta_corrente(value.toString());break;case3:contas.get(rowIndex).setNme_titular(value.toString());break;default:break;}fireTableCellUpdated(rowIndex,columnIndex);}
malves_info
Muito bom esse teu exemplo… Utilizando obejtos… Vlw Parceiro pela ajuda!!!