Não inserir registro duplicado no jTable

8 respostas
java-seswingjava
S

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.

8 Respostas

R

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

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

}
R

Para o contains funcfionar vc precisa implementar o método equals da classe TurmaAlunoDTO, fazendo ele comparar pelo código.

S

Neste caso eu teria que comparar se o objeto que estou inserindo é igual a algum que ja está na tabela?

R

Mas é justamente oq vc disse que queria fazer… E tentou, mas não funciona pq faltou fazer oq escrevi anteriormente.

S

@Rodrigo_Void eu implementei na classe o método equals :

<a class="mention" href="/u/override">@Override</a>

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;

}

Ttentei passar o codigo no método contains mas não esta dando certo.

TurmaAlunoDTO turmaAluno = new TurmaAlunoDTO();
<pre><code>            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);
             
            }

Qual seria a maneira correta de trabalhar com ele, ainda não consegui entender, poderia me dar um exemplo por favor?

R

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

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

Criado 5 de outubro de 2017
Ultima resposta 6 de out. de 2017
Respostas 8
Participantes 2