Sei que já fiz esse tópico umas 3 ou 4 vezes, e peço desculpa por isso, mas estou fazendo isso porque além de não consegui a solução nos tópicos anteriores, ainda pesquisei em tudo quanto é canto para tentar resolver isso (google, youtube, outros tópicos da GUJ, outros forúns de programação, deep web, etc) mas não consegui ainda.
Tenho uma JTable que exibe componentes de um banco de dados. Quando eu faço a exclusão de uma linha, é excluído certamente no banco, porém, a JTable só é atualizada quando eu reinicio o programa. Eu já:
-Tentei chamar o método que preenche minha JTable
-Utilizei o método repaint.
-Utilizei o método fireTableStructureChanged.
-Utilizei o método fireTableDataChanged.
Classe da conexão com o banco de dados:
public class Conectar {
public Statement stm;//responsável por preparar e realizar pesquisas no banco de dados
public ResultSet rs;//responsável por amazenar o resultado de uma pesquisa passada para o Statement
private String driver = "apache_derby_net";//responsável por identificar o serviço de banco de dados
private String caminho = "jdbc:derby://localhost:1527/Higor";//responsável por setar o local do banco de dados
private String usuario = "Higor";
private String senha = "deliciacara15";
public Connection conn; // responsável por realizar a conexão com o banco de dados
public void conexao()
{//método responsável por realizar a conexão com o banco.
try {//tentativa inicial
System.setProperty("jdbc.Drivers", driver);//seta a propriedade do driver de conexão
conn = DriverManager.getConnection(caminho, usuario, senha);//realiza a conexão com o banco de dados.
JOptionPane.showMessageDialog(null, "Conectado com sucesso.");
} catch (SQLException ex) {//se não der certo... \/
JOptionPane.showMessageDialog(null, "Erro de conexão."
+"\nErro:"+ex.getMessage());
}
}
public void executaSQL(String sql)
{
try {
stm = conn.createStatement(rs.TYPE_SCROLL_INSENSITIVE,
rs.CONCUR_READ_ONLY);
rs = stm.executeQuery(sql);
} catch (SQLException ex)
{
Logger.getLogger(Conectar.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void executaSuaMae(String sql)
{//Excluindo uma coluna no banco de dados
try {
stm = conn.createStatement(rs.TYPE_SCROLL_INSENSITIVE,
rs.CONCUR_READ_ONLY);
int x = stm.executeUpdate(sql);
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Método executaSQL\n"
+ "Erro: "+ex.getMessage());
}
}
public void desconecta()
{//método para fechar a conexão com o banco de dados
try {
conn.close();//fecha a conexao
JOptionPane.showMessageDialog(null, "Conexão fechada com sucesso!");
} catch (SQLException ex) {
Logger.getLogger(Conectar.class.getName()).log(Level.SEVERE, null, ex);
JOptionPane.showMessageDialog(null, "Erro ao fechar a conexão."
+ "\nErro:"+ex.getMessage());
}
}
}
Classe da minha tabela:
public class Tabela extends AbstractTableModel {
private ArrayList linhas = null;
private String[] colunas = null;
public Tabela(ArrayList lin, String[] col) {
setLinhas(lin);
setColunas(col);
}
public ArrayList getLinhas() {
return linhas;
}
public void setLinhas(ArrayList dados) {
linhas = dados;
}
public String[] getColunas() {
return colunas;
}
public void setColunas(String[] nomes) {
colunas = nomes;
}
@Override
public int getColumnCount() {
return colunas.length;
}
@Override
public int getRowCount() {
return linhas.size();
}
@Override
public String getColumnName(int numCol) {
return colunas[numCol];
}
@Override
public Object getValueAt(int numLin, int numCol) {
Object[] linha = (Object[]) getLinhas().get(numLin);
return linha[numCol];
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
Object[] linha = (Object[]) getLinhas().get(rowIndex);
linha[columnIndex] = aValue;
fireTableDataChanged();
}
@Override
public boolean isCellEditable(int row, int column) {
return true;
}
public void removeRow(int a)
{
this.fireTableRowsDeleted(a, a);
}
}
Método responsável por preencher minha JTable:
public void preencherTabela(String SQL) {
c.executaSQL(SQL);
try {
c.rs.first();
do {
dados.add(new Object[]{c.rs.getInt("ID"),
c.rs.getString("NOME_DO_ESTADO"),
c.rs.getString("SIGLA_DO_ESTADO")});
} while (c.rs.next());
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Erro ao preencher o ArrayList."
+ "\nERRO: " + ex.getMessage());
}
tabela.setModel(t);
tabela.getColumnModel().getColumn(0).setPreferredWidth(80);
tabela.getColumnModel().getColumn(0).setResizable(true);
tabela.getColumnModel().getColumn(1).setPreferredWidth(204);
tabela.getColumnModel().getColumn(1).setResizable(true);
tabela.getColumnModel().getColumn(2).setPreferredWidth(85);
tabela.getColumnModel().getColumn(2).setResizable(true);
tabela.setCellSelectionEnabled(true);
tabela.getTableHeader().setReorderingAllowed(true);
tabela.setAutoResizeMode(tabela.AUTO_RESIZE_OFF);
tabela.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
t.isCellEditable(0, 0);
t.isCellEditable(0, 1);
t.isCellEditable(0, 2);
t.isCellEditable(1, 0);
t.isCellEditable(1, 1);
t.isCellEditable(1, 2);
t.isCellEditable(2, 0);
t.isCellEditable(2, 1);
t.isCellEditable(2, 2);
}
E por último, temos o botão que deleta uma linha da tabela do banco através de seu ID, que é digitado numa caixa de texto (JTextField):
private void excluirActionPerformed(java.awt.event.ActionEvent evt) {
int o = Integer.parseInt(excluido.getText().trim());
String i = "delete from ESTADOS where ID = ?";
try {
PreparedStatement pst = c.conn.prepareStatement(i);
pst.setInt(1, o);
int x = pst.executeUpdate();
JOptionPane.showMessageDialog(null, "DEU CERTO");
} catch (SQLException ex) {
Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);
JOptionPane.showMessageDialog(null, ex.getMessage());
}
}