Atualizar dados de jTable após atualização de BD

quando eu adicionou, alterou ou excluir algum dado da minha JTable, ele duplicar os dados

package modelTables;

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

import vo.EstoqueVO;

public class EstoqueTableModel extends AbstractTableModel {

private static final long serialVersionUID = 1L;

private List<EstoqueVO> dados = new ArrayList<>();

private String[] colunas = { "Codigo", "Material", "Qts", "Preço", "Status" };

public EstoqueTableModel() {
	dados = new ArrayList<>();
}

@Override
public String getColumnName(int column) {
	return colunas[column];
}

@Override
public int getColumnCount() {
	return colunas.length;
}

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

}

@Override
public Object getValueAt(int linha, int coluna) {

	switch (coluna) {

	case 0:
		return dados.get(linha).getCodigo();
	case 1:
		return dados.get(linha).getMaterial();
	case 2:
		return dados.get(linha).getQts();
	case 3:
		return dados.get(linha).getPreco();
	case 4:
		return dados.get(linha).getStatus();

	}

	return null;
}

@Override
public void setValueAt(Object valor, int linha, int coluna) {
	switch (coluna) {

	case 0:
		dados.get(linha).setCodigo(Integer.parseInt((String) valor));
		break;
	case 1:
		dados.get(linha).setMaterial((String) valor);
		break;
	case 2:
		dados.get(linha).setQts((String) valor);
		break;
	case 3:
		dados.get(linha).setPreco(Double.parseDouble((String) valor));
		break;
	case 4:
		dados.get(linha).setStatus((String) valor);
		break;

	}
	this.fireTableRowsUpdated(linha, linha);
}

public void addRow(EstoqueVO e) {
	this.dados.add(e);
	this.fireTableDataChanged();
}

public void removeRow(int linha) {
	this.dados.remove(linha);
	this.fireTableRowsDeleted(linha, linha);
}

public void limpar() {  
	dados.clear();    
    fireTableDataChanged();  
}  

}

package view;

import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowSorter;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableRowSorter;

import dao.EstoqueDAO;
import modelTables.*;
import vo.EstoqueVO;

import javax.swing.AbstractButton;
import javax.swing.DefaultComboBoxModel;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class ViewEstoque extends JFrame {

/**
 * 
 */

private static final long serialVersionUID = 1L;
EstoqueTableModel tableModel = new EstoqueTableModel();

private JPanel Estoque;
private JTextField txtQts;
private JTextField txtMaterial;
private JTextField txtPreco;
private JTable tblEstoque;
private JTextField txtCodigo;
private JButton btnSalva;
private JButton btnAlterar;
private JButton btnExcluir;
private JComboBox<?> jCStatus;
int frag;

/**
 * Launch the application.
 */
public static void main(String[] args) {
	LookAndFeel look = new LookAndFeel();
	try {
		UIManager.setLookAndFeel(look.lookAndFeel);
	} catch (Exception ex) {

	}
	EventQueue.invokeLater(new Runnable() {
		public void run() {
			try {
				ViewEstoque frame = new ViewEstoque();
				frame.setVisible(true);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	});
}

/**
 * Create the frame.
 */
public ViewEstoque() {
	EstoqueDAO estoqueDAO = new EstoqueDAO();
	setResizable(false);
	setTitle("Estoque ");
	setIconImage(Toolkit.getDefaultToolkit().getImage(ViewEstoque.class.getResource("/imgs/RSS.png")));
	setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	setBounds(100, 100, 773, 530);
	Estoque = new JPanel();
	Estoque.setBorder(new EmptyBorder(5, 5, 5, 5));
	setContentPane(Estoque);
	Estoque.setLayout(null);

	JLabel lblEstoque = new JLabel("Estoque ");
	lblEstoque.setFont(new Font("Arial", Font.PLAIN, 20));
	lblEstoque.setBounds(10, 12, 138, 22);
	Estoque.add(lblEstoque);

	JSeparator separator = new JSeparator();
	separator.setBounds(0, 45, 784, 2);
	Estoque.add(separator);

	JScrollPane scrollPane = new JScrollPane();
	scrollPane.setBounds(4, 113, 542, 363);
	Estoque.add(scrollPane);

	tblEstoque = new JTable();
	tblEstoque.addKeyListener(new KeyAdapter() {
		@Override
		public void keyReleased(KeyEvent arg0) {
			dadosNoCampo();

		}
	});
	tblEstoque.addMouseListener(new MouseAdapter() {
		@Override
		public void mouseClicked(MouseEvent arg0) {
			dadosNoCampo();
		}
	});
	tblEstoque.setModel(tableModel);
	tblEstoque.setRowSorter(new TableRowSorter<EstoqueTableModel>(tableModel));
	readJTable();
	scrollPane.setViewportView(tblEstoque);

	txtQts = new JTextField();
	txtQts.setEnabled(false);
	txtQts.setColumns(10);
	txtQts.setBounds(376, 71, 50, 20);
	Estoque.add(txtQts);

	JButton btnNovo = new JButton("Novo");
	btnNovo.setFont(new Font("Arial", Font.PLAIN, 14));
	btnNovo.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent arg0) {
			frag = 1;
			txtCodigo.setEnabled(true);
			txtMaterial.setEnabled(true);
			txtPreco.setEnabled(true);
			txtQts.setEnabled(true);
			jCStatus.setEnabled(true);
			btnSalva.setEnabled(true);
			btnAlterar.setEnabled(false);
			btnNovo.setEnabled(false);
			btnExcluir.setEnabled(false);
			txtCodigo.requestFocus();

		}
	});
	btnNovo.setBounds(621, 139, 112, 32);
	Estoque.add(btnNovo);

	btnAlterar = new JButton("Alterar");
	btnAlterar.setFont(new Font("Arial", Font.PLAIN, 14));
	btnAlterar.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			frag = 2;

			txtCodigo.setEnabled(false);
			txtMaterial.setEnabled(true);
			txtPreco.setEnabled(true);
			txtQts.setEnabled(true);
			jCStatus.setEnabled(true);

			btnSalva.setEnabled(true);
			btnNovo.setEnabled(false);
			btnExcluir.setEnabled(false);

		}
	});
	btnAlterar.setBounds(621, 188, 112, 32);
	Estoque.add(btnAlterar);

	btnExcluir = new JButton("Excluir");
	btnExcluir.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent arg0) {
			frag = 3;

			if (tblEstoque.getSelectedRow() != -1) {

				EstoqueVO estoqueVO = new EstoqueVO();
				EstoqueDAO estoqueDAO = new EstoqueDAO();

				Object[] options = { "Confirmar", "Cancelar" };
				int Confirm = JOptionPane.showOptionDialog(null, "Clique Confirmar para Exluir", "Informação",
						JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]);
				
				if (Confirm == 0) {

					estoqueVO.setCodigo((int) tblEstoque.getValueAt(tblEstoque.getSelectedRow(), 0));
					estoqueDAO.delete(estoqueVO);
					readJTable();
				}
			} else {
				JOptionPane.showMessageDialog(null, "Selecione um produto para excluir");
			}

		}
	});
	btnExcluir.setFont(new Font("Arial", Font.PLAIN, 14));
	btnExcluir.setBounds(621, 231, 112, 32);
	Estoque.add(btnExcluir);

	btnSalva = new JButton("Salvar");
	btnSalva.setEnabled(false);
	btnSalva.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent arg0) {

			if (txtMaterial.getText().isEmpty()) {
				JOptionPane.showMessageDialog(null, "preencha o Nome Do Material");
				txtMaterial.requestFocus();
			} else if (txtPreco.getText().isEmpty()) {
				JOptionPane.showMessageDialog(null, "preencha o Preço");
				txtPreco.requestFocus();
			} else if (txtQts.getText().isEmpty()) {
				JOptionPane.showMessageDialog(null, "preencha a Quantidade");
				txtQts.requestFocus();
			}

			if (frag == 1) {

				EstoqueVO estoqueVO = new EstoqueVO();
				EstoqueDAO estoqueDAO = new EstoqueDAO();

				estoqueVO.setCodigo(Integer.parseInt(txtCodigo.getText()));
				estoqueVO.setMaterial(txtMaterial.getText());
				estoqueVO.setPreco(Double.parseDouble(txtPreco.getText()));
				estoqueVO.setQts(txtQts.getText());
				estoqueVO.setStatus((String) jCStatus.getSelectedItem());

				estoqueDAO.create(estoqueVO);
				

				txtCodigo.setText("");
				txtMaterial.setText("");
				txtPreco.setText("");
				txtQts.setText("");
				jCStatus.setSelectedIndex(-1);

				txtCodigo.setEnabled(false);
				txtMaterial.setEnabled(false);
				txtPreco.setEnabled(false);
				txtQts.setEnabled(false);
				jCStatus.setEnabled(false);
				btnAlterar.setEnabled(true);
				btnExcluir.setEnabled(true);
				btnSalva.setEnabled(false);
				readJTable();

			}

			else if (frag == 2) {
				if (tblEstoque.getSelectedRow() != -1) {
					dadosNoCampo();
					EstoqueVO estoqueVO = new EstoqueVO();
					EstoqueDAO estoqueDAO = new EstoqueDAO();
					// Integer.parseInt(txtCodigo.getText())
					estoqueVO.setCodigo((int) tblEstoque.getValueAt(tblEstoque.getSelectedRow(), 0));
					estoqueVO.setMaterial(txtMaterial.getText());
					estoqueVO.setPreco(Double.parseDouble(txtPreco.getText()));
					estoqueVO.setQts(txtQts.getText());
					estoqueVO.setStatus((String) jCStatus.getSelectedItem());

					estoqueDAO.update(estoqueVO);

					txtCodigo.setText("");
					txtMaterial.setText("");
					txtPreco.setText("");
					txtQts.setText("");
					jCStatus.setSelectedIndex(-1);

					txtCodigo.setEnabled(false);
					txtMaterial.setEnabled(false);
					txtPreco.setEnabled(false);
					txtQts.setEnabled(false);
					jCStatus.setEnabled(false);
					btnNovo.setEnabled(true);
					btnExcluir.setEnabled(true);
					btnSalva.setEnabled(false);
					readJTable();

				}
			} /*
				 * else if (frag == 3) {
				 * 
				 * if (tblEstoque.getSelectedRow() != -1) {
				 * 
				 * tableModel.removeRow(tblEstoque.getSelectedRow()); }
				 * 
				 * 
				 * }
				 */
		}
	});
	btnSalva.setFont(new Font("Arial", Font.PLAIN, 14));
	btnSalva.setBounds(621, 277, 112, 32);
	Estoque.add(btnSalva);

	JLabel lblQts = new JLabel("Qts: ");
	lblQts.setFont(new Font("Arial", Font.PLAIN, 14));
	lblQts.setBounds(337, 71, 36, 18);
	Estoque.add(lblQts);

	JLabel lblMaterial = new JLabel("Material: ");
	lblMaterial.setFont(new Font("Arial", Font.PLAIN, 14));
	lblMaterial.setBounds(148, 71, 66, 18);
	Estoque.add(lblMaterial);

	txtMaterial = new JTextField();
	txtMaterial.setEnabled(false);
	txtMaterial.setColumns(10);
	txtMaterial.setBounds(215, 71, 112, 20);
	Estoque.add(txtMaterial);

	JLabel lblPreo = new JLabel("Pre\u00E7o");
	lblPreo.setFont(new Font("Arial", Font.PLAIN, 14));
	lblPreo.setBounds(436, 71, 50, 18);
	Estoque.add(lblPreo);

	txtPreco = new JTextField();
	txtPreco.setEnabled(false);
	txtPreco.setColumns(10);
	txtPreco.setBounds(482, 71, 73, 20);
	Estoque.add(txtPreco);

	JLabel lblCodigo = new JLabel("Codigo: ");
	lblCodigo.setBounds(10, 74, 46, 14);
	Estoque.add(lblCodigo);

	txtCodigo = new JTextField();
	txtCodigo.setEnabled(false);
	txtCodigo.setBounds(52, 71, 86, 20);
	Estoque.add(txtCodigo);
	txtCodigo.setColumns(10);

	JLabel lblStatus = new JLabel("Status");
	lblStatus.setBounds(565, 74, 46, 14);
	Estoque.add(lblStatus);

	String[] opcaoCombo = { "Em Estoque", "Estoque Baixo", "Em Falta" };

	jCStatus = new JComboBox(opcaoCombo);
	jCStatus.setModel(new DefaultComboBoxModel(opcaoCombo));
	jCStatus.setSelectedIndex(-1);
	jCStatus.addActionListener(jCStatus);
	jCStatus.setEnabled(false);
	jCStatus.setBounds(621, 71, 112, 20);
	Estoque.add(jCStatus);

}

public void readJTable() {
	EstoqueTableModel modelo = (EstoqueTableModel) tblEstoque.getModel();

	EstoqueDAO edao = new EstoqueDAO();

	for (EstoqueVO e : edao.read()) {
		modelo.addRow(e);
		modelo.fireTableDataChanged();

	}

}

public void dadosNoCampo() {
	txtCodigo.setText((String) tblEstoque.getValueAt(tblEstoque.getSelectedRow(), 0).toString());
	txtMaterial.setText((String) tblEstoque.getValueAt(tblEstoque.getSelectedRow(), 1));
	txtQts.setText((String) tblEstoque.getValueAt(tblEstoque.getSelectedRow(), 2));
	txtPreco.setText((String) tblEstoque.getValueAt(tblEstoque.getSelectedRow(), 3).toString());
	jCStatus.setSelectedItem((Object) tblEstoque.getValueAt(tblEstoque.getSelectedRow(), 4));

}

}

package dao;

import connection.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JOptionPane;

import vo.*;

public class EstoqueDAO {

public void create(EstoqueVO e) {

	Connection con = ConnectionFactory.getConnection();

	PreparedStatement stmt = null;

	try {
		stmt = con
				.prepareStatement("INSERT INTO estoque (Codigo,Material,Quatidade,preco,Status)VALUES(?,?,?,?,?)");
		stmt.setInt(1, e.getCodigo());
		stmt.setString(2, e.getMaterial());
		stmt.setString(3, e.getQts());
		stmt.setDouble(4, e.getPreco());
		stmt.setString(5, e.getStatus());

		stmt.executeUpdate();

		JOptionPane.showMessageDialog(null, "Salvo com sucesso!");
	} catch (SQLException ex) {
		System.out.println(ex);
	} finally {
		ConnectionFactory.closeConnection(con, stmt);
	}

}

public List<EstoqueVO> read() {

	Connection con = ConnectionFactory.getConnection();
	PreparedStatement stmt = null;
	ResultSet rs = null;
	List<EstoqueVO> estoque = new ArrayList<>();

	try {
		stmt = con.prepareStatement("select * from estoque");
		rs = stmt.executeQuery();

		while (rs.next()) {

			EstoqueVO estoqueVO = new EstoqueVO();
			estoqueVO.setCodigo(rs.getInt("Codigo"));
			estoqueVO.setMaterial(rs.getString("Material"));
			estoqueVO.setPreco(rs.getDouble("preco"));
			estoqueVO.setQts(rs.getString("Quatidade"));
			estoqueVO.setStatus(rs.getString("Status"));

			estoque.add(estoqueVO);
		}

	} catch (SQLException e) {
		Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, e);

	} finally {
		ConnectionFactory.closeConnection(con, stmt, rs);
	}
	return estoque;
}

public void update(EstoqueVO e) {

	Connection con = ConnectionFactory.getConnection();

	PreparedStatement stmt = null;

	try {
		stmt = con.prepareStatement(
				"Update estoque set Material = ? ,Quatidade = ?,preco = ? ,Status = ? where Codigo = ? ");
		stmt.setString(1, e.getMaterial());
		stmt.setString(2, e.getQts());
		stmt.setDouble(3, e.getPreco());
		stmt.setString(4, e.getStatus());
		stmt.setInt(5, e.getCodigo());

		stmt.executeUpdate();

		JOptionPane.showMessageDialog(null, "Atualizado com sucesso!");
	} catch (SQLException ex) {
		System.out.println(ex);
	} finally {
		ConnectionFactory.closeConnection(con, stmt);
	}

}

public void delete(EstoqueVO e) {

	Connection con = ConnectionFactory.getConnection();

	PreparedStatement stmt = null;

	try {
		stmt = con.prepareStatement("delete from estoque where Codigo = ? ");

		stmt.setInt(1, e.getCodigo());

		stmt.executeUpdate();

		JOptionPane.showMessageDialog(null, "Excluido com sucesso!");
	} catch (SQLException ex) {
		System.out.println(ex);
	} finally {
		ConnectionFactory.closeConnection(con, stmt);
	}

}

}