Abstract Table Model repetindo icones renderizados?

Estou tentando a algum tempo implementar uma Abstract Table model com algumas diferenças das outras que eu fiz.

Seguinte, tenho uma Lista de Questionarios (no BD), e uma Lista de datas (setadas pelo usuario), tendo isto, populo a Table de acordo com outra tabela de respostas, identificada por Questionario e Data (visto que é único pelas restrições).

Ocorre que, para teste deixo em branco algumas datas a serem exibidas, e, a principio as regras funcionam, porém, a tabela renderiza inclusive as celulas que deveriam estar vazias.

Meu Modelo:


    public class AdesaoTableModel extends AbstractTableModel {

        private List<Adesao_protocolo> lista_adesao = new ArrayList<>();
        private List<Date> listaDatas = new ArrayList<>();
        private List<Adesao_protocolo> itens = new ArrayList<>();
        
        private List<Questionario> questionarios = new ArrayList<>();
               
        public AdesaoTableModel() {
            Configuracoes conf = new Configuracoes();
            conf.setCon_id(1);
            conf=new ConfiguracoesDAO().buscar(conf);
            
            questionarios=new QuestionarioDAO().listar();
            for(int i=0;i<questionarios.size();i++){
                if(questionarios.get(i).getQue_id()==conf.getCon_que_flag()){
                    questionarios.remove(i);
                }
                    
            }
            listaDatas=new Execucoes().ListaDatasUteis(tf_Data_ini.getDate(),tf_Data_fim.getDate());
            Adesao_protocolo ade = new Adesao_protocolo();
            lista_adesao = new Adesao_protocoloDAO().ListaAdesao_UnidadePorData(tf_Data_ini.getDate(),tf_Data_fim.getDate(), (Unidade) CB_Unidade.getSelectedItem());
           
                for(int i=0;i<lista_adesao.size();i++){
                if(lista_adesao.get(i).getTipo()==1){
                    ade=lista_adesao.get(i);
                    itens.add(ade);
                
            }
            }
        }

        public int getRowCount() {
            
            return questionarios.size();
            
        }

        public int getColumnCount() {

        int col=new Execucoes().NumDiasUteisEntreDatas(tf_Data_ini.getDate(),tf_Data_fim.getDate());
        if(filtro_pratica.isSelected()==true){
             col=col+1;   
            }
            return col+3;
        }

        @Override
        public String getColumnName(int column) {
            if(column==getColumnCount()-1){
                return "Adesão Geral";
            }

            if (column == 0) {
                return "Unidade";
            } else if (column == 1) {
                return "Protocolo";
            }else if (column <= this.getColumnCount()-2) {
               for(int i=2;i<this.getColumnCount();i++){
                    if(column==i){
                        return new Execucoes().FormataData(listaDatas.get(i-2));
                    }
                }
            
            }
            return "";
        }
           
        

        @Override
        public Class getColumnClass(int columnIndex) {

                if (columnIndex == 0 || columnIndex == 1 || columnIndex==getColumnCount()-1) {
                return String.class;
                }else {
                return Image.class;
                }
            
                
        }

        public Object getValueAt(int rowIndex, int columnIndex) { 
            Icon editar = null;
            Unidade u = (Unidade) CB_Unidade.getSelectedItem();
            Questionario q = questionarios.get(rowIndex);
            int cont=0;
            if (columnIndex == getColumnCount()-1) {
                return "Total";
            }else if (columnIndex<=getColumnCount()-2 && columnIndex>1) {
                
                for(int i=0;i<itens.size();i++){
                
                    if(new Execucoes().FormataData(itens.get(i).getAde_data()).equals(getColumnName(columnIndex))==true && itens.get(i).getQuestionario().getQue_id()==q.getQue_id()){
                       cont++; 
                        int adesao=itens.get(i).getAde_taxa();
                        if(adesao>80){
                            editar = new ImageIcon(getClass().getResource("/img/semRisco.png"));
                            return editar;
                        }else if(adesao>50 && adesao <80){
                            editar = new ImageIcon(getClass().getResource("/img/EmAlta.png"));
                            return editar;
                        }else{
                            editar = new ImageIcon(getClass().getResource("/img/vermelho.png"));
                            return editar;
                        }
                   }  
                }if(cont==0){return "Sem Coleta";}
            }else if (columnIndex == 1) {
                return q.getQue_nome();
            }else if (columnIndex == 0) {
                return u.getUni_descricao();
            } 
            return "";
        }
    }
private void carregaTabela(){
        int col=new Execucoes().NumDiasUteisEntreDatas(tf_Data_ini.getDate(),tf_Data_fim.getDate())+3;

        model = new AdesaoTableModel();
        jTable1.setModel(model);
        //filtro = new TableRowSorter<>(model);
        jTable1.setRowSorter(filtro); 
        TableColumnModel ColumnModel = jTable1.getColumnModel();
        JTableRenderer renderer = new JTableRenderer();
       
        for(int i=1;i<col;i++){
            if(i>2 && i<col-1){
            ColumnModel.getColumn(i).setCellRenderer(renderer);
        }
        }
    }

Classe de renderização

public class JTableRenderer extends DefaultTableCellRenderer  {
    protected void setValue(Object value){
        if (value instanceof ImageIcon){
            if (value != null){
                ImageIcon d = (ImageIcon) value;
                setIcon(d);
            } else{
                setText("");
                setIcon(null);
            }
        } else {
            super.setValue(value);
        }
    }
}

Alguma Luz?

Qual o método que insere linhas na tabela; e
Qual o método que remove linhas da tabela?

Se o método que remove as linhas estiver usando o for, veja se caberia usar o while.
Quando digo remover linhas, me refiro a limpar toda a tabela e depois popular a mesma com a lista de itens.