@Moraisdelimahigor escreveu:
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()); } }
Mensagens: 1
Participantes: 1