Olá galera, estou com uma duvida e não consegui achar alguma coisa pesquisando aqui no grupo, gostaria de saber como posso fazer para não deixar que registros duplicados sejam inseridos em uma jTable, estou tenando usar o método contains mas acho que estou usando ele incorretamente.
Tenho o meu próprio TabelModel que extend de um AbstractTableModel
// inserindo linhas na minha jtablemeuModelo.addRow(objEstudo);minhaJtable.setModel(objEstudo);//Gostaria de saber como usar corretamente este método para verificar se o registro ja existe em minha jtable.meuModelo.getDataSet().contains()
tentei passar o retorno do método contains para um booleano mas não deu certo, ele não fez o correto não distinguiu se o registro era duplicado, ele só verificou se ja tinha algo na tabela.
Ola, posta o seu código completo, este parece zoado. No contains vc deve passar pro parâmetro o objeto que vc quer localizar na lista. No addRow e no setModel vc está passando o mesmo objeto, não faz sentido, são coisas completamente diferentes.
S
shodaime
olá este é o trecho do código que estou tentando impedir que o registro duplicado seja inserido na tabela
//trecho do código onde insere os dados, e também tento tratar para não entra dados repetidos.TurmaAlunoDTOturmaAluno=newTurmaAlunoDTO();turmaAluno.setIdTurma(idTurma);turmaAluno.setIdAluno(idAluno);turmaAluno.setNomeAluno(nomeAluno);booleanalunoRepetido=false;modeloTurmaAluno.addRow(turmaAluno);jTableAlunoTurma.setModel(modeloTurmaAluno);formataTabela();jTextFieldAluno.setText(null);idAluno=0;nomeAluno=null;alunoRepetido=modeloTurmaAluno.getDataSet().contains(turmaAluno);/// para remover repeditos.
abaixo o meu TabelModel
publicclassTabelModelTurmaAlunoMatriculaDTOextendsAbstractTableModel{// lista que vai conter todos os dados do JTable privateList<TurmaAlunoDTO>dataset;// Constante que defini o nome das colunas privatestaticfinalString[]col={"Codigo","Aluno"};// Construtor da classe recebe os dados a ser populado publicTabelModelTurmaAlunoMatriculaDTO(List<TurmaAlunoDTO>bean){dataset=newArrayList<TurmaAlunoDTO>(bean);fireTableStructureChanged();}publicTabelModelTurmaAlunoMatriculaDTO(){dataset=newArrayList<TurmaAlunoDTO>();fireTableStructureChanged();}// Método sobrescrito que retorna o número de linhas do JTable, após populado @OverridepublicintgetRowCount(){returndataset.size();}// Método sobrescrito que retorna o número de colunas do JTable após populado @OverridepublicintgetColumnCount(){returncol.length;}// Método sobrescrito que vai popular e retornar cada célula do JTable @OverridepublicObjectgetValueAt(introwIndex,intcolumnIndex){TurmaAlunoDTOcbean=dataset.get(rowIndex);Objectrow=null;switch(columnIndex){// case 0: row = cbean.getIdProduto(); break; case0:row=cbean.getIdAluno();break;case1:row=cbean.getNomeAluno();break;case2:row=cbean.getDsTurma();break;case3:row=cbean.getIdTurma();break;case4:row=cbean.getIdTurmaAluno();break;}returnrow;}/* Este método sobrescrito, defini se o JTable será editável ou não. Voce pode definir qual coluna de qual linha será editável. Caso voce defina que o seu JTable seja editável, então é necessário definir também o método "setValueAt" que vem logo a seguir, caso contrário, é só retornar false para todas as linhas e colunas, como definido abaixo. */@OverridepublicbooleanisCellEditable(introwIndex,intcolumnIndex){// return true; returnfalse;}/* Este método sobrescrito, permite voce editar o JTable, caso o método anterior tenha algumas colunas de algumas ou todas linhas editáveis setadas para true, ou que tenha como retorno o valor true para todas as linhas e colunas. */@OverridepublicvoidsetValueAt(Objectvalue,introw,intcol){TurmaAlunoDTOdado=dataset.get(row);switch(col){case0:dado.setIdAluno((Long)value);break;case1:dado.setNomeAluno((String)value);break;case2:dado.setDsTurma((String)value);break;case3:dado.setIdTurma((Long)value);break;case4:dado.setIdTurmaAluno((Long)value);break;}fireTableCellUpdated(row,col);}// Este método sobrescrito define que tipo de dado será retornado para cada coluna @OverridepublicClassgetColumnClass(intcolumn){if(column==0){returnlong.class;}if(column==3){returnlong.class;}if(column==4){returnlong.class;}else{returnString.class;}}/* Este método criado por nós, vai retornar o conjunto de dados inteiro do JTable, através de um List contendo Objetos ClienteBean populados. */publicList<TurmaAlunoDTO>getDataSet(){returndataset;}/* Este método sobrescrito vai definir o nome das colunas que foi atribuído na constante "col" logo no início da classe */@OverridepublicStringgetColumnName(intcolumn){returncol[column];}/* Este método foi criado por nós para retornar um objeto ClienteBean populado, de acordo com o número de linha do JTable fornecido pelo parâmetro "int row" */publicTurmaAlunoDTOgetRow(introw){returndataset.get(row);}/* Este método criado por nós, serve para voce criar um ClienteBean e populá-lo fora do JTable e passar para este método que vai acrescentar os dados na última linha do JTable sem que haja a necessidade de se usar o método "setValueAt(...)" */publicvoidaddRow(TurmaAlunoDTObean){dataset.add(bean);fireTableDataChanged();}/* Este método foi criado por nós para remover uma linha específica do JTable, de acordo com linha fornecida pelo parâmetro "int row" */publicvoidremoveRow(introw){dataset.remove(row);fireTableDataChanged();}/* Este método criado por nós, acrescenta uma linha em branco no JTable, caso voce queira inserir dados diretamente no JTable tem que chamar este método antes. */publicvoidaddEmptyRow(){dataset.add(newTurmaAlunoDTO());fireTableDataChanged();}// metodo criado para limpar todos os dados da tabela.publicvoidclearRow(){dataset.clear();fireTableDataChanged();}}
R
Rodrigo_Void
Para o contains funcfionar vc precisa implementar o método equals da classe TurmaAlunoDTO, fazendo ele comparar pelo código.
S
shodaime
Neste caso eu teria que comparar se o objeto que estou inserindo é igual a algum que ja está na tabela?
R
Rodrigo_Void
Mas é justamente oq vc disse que queria fazer… E tentou, mas não funciona pq faltou fazer oq escrevi anteriormente.
S
shodaime
@Rodrigo_Void eu implementei na classe o método equals :
Ttentei passar o codigo no método contains mas não esta dando certo.
TurmaAlunoDTOturmaAluno=newTurmaAlunoDTO();<pre><code>turmaAluno.setIdTurma(idTurma);turmaAluno.setIdAluno(idAluno);turmaAluno.setNomeAluno(nomeAluno);booleanalunoRepetido=false;modeloTurmaAluno.addRow(turmaAluno);jTableAlunoTurma.setModel(modeloTurmaAluno);formataTabela();jTextFieldAluno.setText(null);idAluno=0;nomeAluno=null;alunoRepetido=modeloTurmaAluno.getDataSet().contains(turmaAluno.getIdAluno());/// para remover repeditos.if(alunoRepetido==true){JOptionPane.showMessageDialog(this,"Este Aluno já esta matriculado nesta Turma!","ATENÇÃO!",JOptionPane.WARNING_MESSAGE);}
Qual seria a maneira correta de trabalhar com ele, ainda não consegui entender, poderia me dar um exemplo por favor?
R
Rodrigo_Void
Não te disse pra meche no parametro do metodo contains. Vc só era pra implementar o equals e fazer por CODIGO, vc enfiou todos campos la.
Lê primeiro, procure entender oq está fazendo:
S
shodaime
sobrescrevi o método equals, debugando o código vi que quando passa por ele, retorna o valor correto.
O problema está no contains que pelo que pude perceber ele apenas verifica se tem alguma coisa na tabela, gostaria de saber se no TabelModel consigo identificar se existem registros duplicados.
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final TurmaAlunoDTO other = (TurmaAlunoDTO) obj;
if (this.idAluno != other.idAluno) {
return false;
}
return true;
}