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 jtable
meuModelo.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.
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.
TurmaAlunoDTO turmaAluno = new TurmaAlunoDTO();
turmaAluno.setIdTurma(idTurma);
turmaAluno.setIdAluno(idAluno);
turmaAluno.setNomeAluno(nomeAluno);
boolean alunoRepetido = 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
public class TabelModelTurmaAlunoMatriculaDTO extends AbstractTableModel {
// lista que vai conter todos os dados do JTable
private List<TurmaAlunoDTO> dataset;
// Constante que defini o nome das colunas
private static final String[] col = {"Codigo", "Aluno"};
// Construtor da classe recebe os dados a ser populado
public TabelModelTurmaAlunoMatriculaDTO(List<TurmaAlunoDTO> bean) {
dataset = new ArrayList<TurmaAlunoDTO>(bean);
fireTableStructureChanged();
}
public TabelModelTurmaAlunoMatriculaDTO() {
dataset = new ArrayList<TurmaAlunoDTO>();
fireTableStructureChanged();
}
// Método sobrescrito que retorna o número de linhas do JTable, após populado
@Override
public int getRowCount() {
return dataset.size();
}
// Método sobrescrito que retorna o número de colunas do JTable após populado
@Override
public int getColumnCount() {
return col.length;
}
// Método sobrescrito que vai popular e retornar cada célula do JTable
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
TurmaAlunoDTO cbean = dataset.get(rowIndex);
Object row = null;
switch (columnIndex) {
// case 0: row = cbean.getIdProduto(); break;
case 0:
row = cbean.getIdAluno();
break;
case 1:
row = cbean.getNomeAluno();
break;
case 2:
row = cbean.getDsTurma();
break;
case 3:
row = cbean.getIdTurma();
break;
case 4:
row = cbean.getIdTurmaAluno();
break;
}
return row;
}
/* 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. */
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
// return true;
return false;
}
/* 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. */
@Override
public void setValueAt(Object value, int row, int col) {
TurmaAlunoDTO dado = dataset.get(row);
switch (col) {
case 0:
dado.setIdAluno((Long) value);
break;
case 1:
dado.setNomeAluno((String) value);
break;
case 2:
dado.setDsTurma((String) value);
break;
case 3:
dado.setIdTurma((Long) value);
break;
case 4:
dado.setIdTurmaAluno((Long) value);
break;
}
fireTableCellUpdated(row, col);
}
// Este método sobrescrito define que tipo de dado será retornado para cada coluna
@Override
public Class getColumnClass(int column) {
if (column == 0) {
return long.class;
}
if (column == 3) {
return long.class;
}
if (column == 4) {
return long.class;
} else {
return String.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. */
public List<TurmaAlunoDTO> getDataSet() {
return dataset;
}
/* Este método sobrescrito vai definir o nome das colunas
que foi atribuído na constante "col" logo no início da classe */
@Override
public String getColumnName(int column) {
return col[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" */
public TurmaAlunoDTO getRow(int row) {
return dataset.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(...)" */
public void addRow(TurmaAlunoDTO bean) {
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" */
public void removeRow(int row) {
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. */
public void addEmptyRow() {
dataset.add(new TurmaAlunoDTO());
fireTableDataChanged();
}
// metodo criado para limpar todos os dados da tabela.
public void clearRow() {
dataset.clear();
fireTableDataChanged();
}
}
Para o contains funcfionar vc precisa implementar o método equals da classe TurmaAlunoDTO, fazendo ele comparar pelo código.
Neste caso eu teria que comparar se o objeto que estou inserindo é igual a algum que ja está na tabela?
Mas é justamente oq vc disse que queria fazer… E tentou, mas não funciona pq faltou fazer oq escrevi anteriormente.
@Rodrigo_Void eu implementei na classe o método equals :
[CODE]
@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.idTurmaAluno != other.idTurmaAluno) {
return false;
}
if (this.idTurma != other.idTurma) {
return false;
}
if (this.idAluno != other.idAluno) {
return false;
}
if (this.idCriadoPor != other.idCriadoPor) {
return false;
}
if (this.idAtualizadoPor != other.idAtualizadoPor) {
return false;
}
if (!Objects.equals(this.nomeAluno, other.nomeAluno)) {
return false;
}
if (!Objects.equals(this.dsTurma, other.dsTurma)) {
return false;
}
if (!Objects.equals(this.dataCriacao, other.dataCriacao)) {
return false;
}
if (!Objects.equals(this.dataAtualizacao, other.dataAtualizacao)) {
return false;
}
return true;
}
[/CODE]
Ttentei passar o codigo no método contains mas não esta dando certo.
[CODE]
TurmaAlunoDTO turmaAluno = new TurmaAlunoDTO();
turmaAluno.setIdTurma(idTurma);
turmaAluno.setIdAluno(idAluno);
turmaAluno.setNomeAluno(nomeAluno);
boolean alunoRepetido = 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);
}
[/CODE]
Qual seria a maneira correta de trabalhar com ele, ainda não consegui entender, poderia me dar um exemplo por favor?
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:
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;
}