Ajuda com DELETE em TableModel

13 respostas
B

Ola pessoal minha duvida é o seguinte qual melhor e simples metodo para deletar um registro no BD Mysql,
estou passando os dados cadastrados para o tablemodel e mostrando no JTable.

na JTable eu mostro o ID tambem.

eu iria tentar fazer assim, uma caixa de mensagem para o usuario digita o ID em que gostaria de deletar, e uma confirmando, mas
eu iria atribuir o valor á uma variavel mas como passa-la parra o DeleteDAO? como chamar isso tudo no evento do botao?
por exemplo:
cliquei no botao deletar, aparece mensagem, digita o id correspondente, armazena na variavel, e agora? eu crio um objeto do tipo DeleteDao, e como mando pra ele
a variavel?

outra coisa nao conheço muito bem tablemodel, tem algum jeito de fazer por ela?
um outro problema me falaram pra fazer com JDialog, eu uso o netbeans e nao sei usar alguem pode me explicar quais seus funcionamentos?

Muito Obrigado.

13 Respostas

ViniGodoy

Se você montou seu próprio TableModel:

a) O sujeito pressiona o botão deletar;

b) Você pega o índice selecionado da tabela com o método suaTable.getSelectedIndex() ou getSelectedIndices() caso você permita seleção em várias linhas;

c) Você pergunta ao seu model qual é o objeto daquela linha. O id não precisa estar visível na tabela;

d) Você passa aquele objeto para o DAO, para que ele seja excluído;

e) Se o objeto for excluído, você exclui ele também do seu model, que deverá avisar a JTable que aquela linha foi excluída.

Por exemplo, se for uma tela de clientes, esses passos ficam assim:

public void excluirActionPerformed(ActionEvent evt) { int index = suaTabela.getSelectedRow(); if (index == -1) return; //Não tinha nada selecionado ClienteTableModel model = (ClienteTableModel)tblClientes.getModel(); Cliente selecionado = model.get(index); if (!clienteDao.excluir(cliente)) { JOptionPane.showMessageDialog(this, "Não foi possível excluir o cliente!"); return; } model.excluir(index); }

drsmachado

Caramba, você tá muito confuso.
Vejo que tua dúvida não é referente à como executar o DELETE e sim em como fazer para o método que utiliza esta instrução ser chamado.
1 - Primeiro pesquise sobre actionEvent para JButton.
2 - Pesquise sobre getters e setters, sobre invocação de métodos de objetos e o básico de OO.
3 - Não acho que abrir uma tela pedindo o ID seja a melhor abordagem, o ideal era deletar identificando o ID direto da linha selecionada.
4 - TableModel não é responsável por isto, ela é responsável por “estruturar” tua tabela.
5 - Faça com o que você conhece, quando tiver tempo, você pesquisa sobre outras coisas.

B

duvidas:

int index = tbComputadores.getSelectedIndex();//esse método esta sublinhado em vermelho na parte do getSelectedIndex
//aqui to pegando indice da tabela, seu eu trocasse por getSelectedRow? funcionaria?


ComputadoresBean selecionado = model.get(index);//aqui nao entendi, ta dando erro no model.get(index);

model.remove(index);//esse metodo remove é o metodo da tablemodel?

public void remove(int indice) {
		comp.remove(indice);
		fireTableRowsDeleted(indice, indice);
	}

Acho que estou complicando demais, se eu consegui entender vou tentar fazer assim senao acho que vou tenta por mensagem mesmo.

Muito obrigado pela força.

ViniGodoy

Respondendo sua dúvida:

  1. Sim, o nome é getSelectedRow() não getSelectedIndex() confundi.
  2. O model é uma variável do tipo ComputadoresBeanTableModel, classe que você deve ter criado, e que está definida como model da JTable. Outra opção é usar o ObjectTableModel do projeto Towel, que funciona também;
  3. Sim, o método get e o método remove, que citei, são do TableModel. Se você ainda não escreveu o seu próprio TableModel, veja os links da minha assinatura. Em hipótese alguma use o DefaultTableModel. O DefaultTableModel é a maneira incorreta de trabalhar com o JTable.

Só não entendi pq seu código está completamente diferente do meu. Você “capou” um monte de coisas dele, como o trecho onde eu criava a variável model.

B

Eu fiz meu tablemodel seguindo suas dicas.

public class TableModelComputadores extends AbstractTableModel {   
    
	
	private List<ComputadoresBean> comp;

	public TableModelComputadores() {
		// no construtor, instanciamos o List
		comp = new ArrayList<ComputadoresBean>();
	}
	/**
	 * Criamos um construtor de conveniencia para ja popular a lista.
	 * 
	 * @param lista
	 *            a lista de clientes a ser adicionada.
	 *
	public TableModelComputadores(List<ComputadoresBean> lista) {
		this();
		comp.addAll(lista);
	}

	@Override
	public Class<?> getColumnClass(int coluna) {
		// todas as colunas representam uma String
		return String.class;
	}

	@Override
	public int getColumnCount() {
		
		return 5;
	}

	@Override
	public String getColumnName(int coluna) {
		// vamos retornar o nome de cada coluna
		switch (coluna) {
		case 0:
			return "ID"; 
		case 1:
			return "Data de CADASTRO"; 
		case 2:
			return "Equipamento"; 
                case 3:
			return "Nome"; 
                case 4:
			return "Serial"; 
		default:
			return ""; 
		}
	}

	@Override
	public int getRowCount() {
		
		return comp.size();
	}

	@Override
	public Object getValueAt(int linha, int coluna) {
		
		ComputadoresBean cb = comp.get(linha);
		
		switch (coluna) {
		case 0:
			return cb.getId(); // retornamos o ID
		case 1:
			return cb.getData(); // retornamos a Data
		case 2:
			return cb.getTipo(); // tipo
		case 3:
			return cb.getNome(); // nome
                case 4:
			return cb.getSerial(); // serial
                default:
			return null; // isso nunca deve ocorrer, pois temos so 5 colunas
		}
	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		
		return true;
	}

	@Override
	public void setValueAt(Object valor, int linha, int coluna) {
		
		ComputadoresBean cb = comp.get(linha);
		switch (coluna) {
		case 0:
			cb.setId(Integer.parseInt(valor.toString())); // mudamos o ID
			break;
		case 1:
			cb.setData(valor.toString()); // mudar
			break;
		case 2:
			cb.setTipo(valor.toString()); //mudar ....
			break;
                case 3:
			cb.setNome(valor.toString()); // mudar....
			break;
                case 4:
			cb.setSerial(valor.toString()); // mudar....
			break;
		}
		// &#65533; importante notificar os listeners a cada alteracao
		fireTableDataChanged();
	}

	
	public void adiciona(ComputadoresBean cb) {
		comp.add(cb);
		
		fireTableRowsInserted(comp.size() - 1, comp.size() - 1);
	}

	
	public void remove(int indice) {
		comp.remove(indice);
		fireTableRowsDeleted(indice, indice);
	}

	
	public int getIndice(ComputadoresBean cb) {
		return comp.indexOf(cb);
	}

	public void adicionaLista(List<ComputadoresBean> lista) {
		int i = comp.size();
		comp.addAll(lista);
		fireTableRowsInserted(i, i + lista.size());
	}

	
	public void limpaLista() {
		int i = comp.size();
		comp.clear();
		fireTableRowsDeleted(0, i - 1);
	}

}

o seu metodo exclui acho que é o meu metodo remove, mas e o metodo get? é o meu getIndice?

Desculpa é que eu tava alterando seu código aqui pra tentar entender.

ViniGodoy

Não, o get deve pegar um índice e retornar o bean que está naquela linha.

Seria implementado assim:

public ComputadoresBean get(int row) { return comp.get(row); }

B

To quase, consegui remover as linhas, mas ainda to com dificuldade pra passar pro dao e remover do BD

e outra coisa.

public void excluirActionPerformed(ActionEvent evt) {   
   int index = suaTabela.getSelectedRow();   
   if (index == -1) return; //Não tinha nada selecionado   
   ClienteTableModel model = (ClienteTableModel)tblClientes.getModel();   
   Cliente selecionado = model.get(index);   
   if (!clienteDao.excluir(selecionado)) {//nessa linha nao entendi a logica  o que esta sendo o cliente ai?   
      JOptionPane.showMessageDialog(this, "Não foi possível excluir o cliente!");   
      return;   
   }   
   model.excluir(index);   
}
ViniGodoy

Ali vc está pedindo para o DAO excluir o cliente em questão do banco de dados. Teu DAO não tem um método de excluir?

B

olha o dao

public class DelCompDAO {
    
     private Connection conn; 
     
        public DelCompDAO() throws Exception { 
        this.conn = ConnectionFactory.getConnection();   
        }
        
        public void delComputadores(ComputadoresBean b) throws SQLException{        
        try{ 
        String sql = "DELETE FROM registropc where idRegistroComp = ?";   
            
        PreparedStatement pst = this.conn.prepareStatement(sql);  
        
        pst.setObject(1, b);
        pst.executeUpdate();
        pst.close();
        }catch(Exception e){
        }
         
                
        finally{   
         try{   
         conn.close(); 
         System.out.println("del conexão fechada");
         }catch(SQLException ConClose){   
          System.out.println("Houve erro no fechamento da conexão");   
          ConClose.printStackTrace(System.err);   
         }   
       }




}
ViniGodoy

Então, ali você chama o delComputadores.

Mas teu método não está muito legal, seria mais ou menos assim:

public class DelCompDAO {    
   public DelCompDAO() { 
   }
        
   public boolean delComputadores(ComputadoresBean b) {        
      Connection conn = ConnectionFactory.getConnection();
      PreparedStatement pst;

      try{ 
         pst = conn.prepareStatement(&quot;DELETE FROM registropc WHERE idRegistroComp = ?&quot;);       
         pst.setInt(1, b.getId());
         return pst.executeUpdate() &gt; 0;         
      }catch(Exception e){
            throw new RuntimeException(&quot;Impossível excluir&quot;, e);
      } finally{   
         try{   
            if (pst != null) 
               pst.close();
            conn.close(); 
            System.out.println(&quot;del conexão fechada&quot;);
         }catch(SQLException ConClose){   
            System.out.println(&quot;Houve erro no fechamento da conexão&quot;);   
            ConClose.printStackTrace(System.err);   
         }   
      }
      return false;
   }
}
ViniGodoy

Seu if ficaria:

DelCompDao dao = new DelCompDao();

B

Olha consegui, mas fiz umas coisinhas... olha.

nt index = tbComputadores.getSelectedRow();   
          if (index == -1) return; //Não tinha nada selecionado   
          TableModelComputadores model = (TableModelComputadores)tbComputadores.getModel();   
          ComputadoresBean selecionado = model.get(index);   
          //if (!DelCompDAO.delComputadores(selecionado)){   
            //JOptionPane.showMessageDialog(this, "Não foi possível excluir o cliente!");   
            //return;   
          //}   
          model.remove(index);
          DelCompDAO dao;             
        try {
            dao = new DelCompDAO();
            dao.delComputadores(selecionado);
            return;
        } catch (Exception ex) {
            ex.printStackTrace();
        }

a parte do if ta dando erro entao fiz da maneira abaixo.

e na parte do Dao;

public class DelCompDAO {
    
       public DelCompDAO() {   
   }   
           
   public boolean delComputadores(ComputadoresBean b) throws SQLException {           
      Connection conn = ConnectionFactory.getConnection();   
      PreparedStatement pst = null;   
  
      try{   
         pst = conn.prepareStatement("DELETE FROM registropc WHERE idRegistroComp = ?");         
         pst.setInt(1, b.getId());   
         return pst.executeUpdate() > 0;           
      }catch(Exception e){   
            throw new RuntimeException("Impossível excluir", e);   
      } finally{     
         try{     
            if (pst != null)   
                pst.close();   
                conn.close();   
                System.out.println("del conexão fechada");   
         }catch(SQLException ConClose){     
            System.out.println("Houve erro no fechamento da conexão");     
            ConClose.printStackTrace(System.err);     
         }     
      }   
      //return false;   
   }   
}

esse return false ta sublinhado em vermelho , deixei ele assim e funfou...

Bom se puder me explicar , ja estou muito agradecido pela sua ajuda.
agora posso estudar isso e ficar testando.

Muito Obrigado pela força.

ViniGodoy

Que erro estava dando no if? É uma boa idéia excluir do model só se o método não disparar exception. Caso contrário, você pode acabar excluindo no JTable, mas não no banco.

Mova a linha:

Para antes do return da linha 14.

Criado 20 de julho de 2011
Ultima resposta 22 de jul. de 2011
Respostas 13
Participantes 3