Estou tentando a horas, pesquisando toda idéia que aparece, todos os caminhos indicados, mas nada de atualizar a tabela. já até consegui limpar a tabela [setRowCount=0], mas não conseguir escrever a query de volta. Deixe-me explicar com calma.
Eu tenho uma classe que exibe uma tabela de um banco de dados quando é chamada. Na interface desta tabela eu coloquei botões para adicionar, deletar, atualizar e procurar registros.
Contudo quando uso o botão para adicionar o registro eu consigo adicionar no banco de dados a nova linha, mas não consigo atualizar a tabela para mostrar no novo registro.
Estou aprendendo ainda, então eu peguei códigos aki e ali para montar o programa, são 5 classes que estão tirando meu sono…
classe de conexão:
[code]/**
- @author Luciano Santos
-
@site www.analisedesistemas.wordpress.com
*/
package escola;
import java.sql.;
import java.io.;
public class ConexaoDB {
public Connection con;
FileInputStream fi;
BufferedReader buff;
String line = "";
String[] lines = new String[30];
int i = 0;
public ConexaoDB() {
try {
fi = new FileInputStream("/home/luciano/Documentos/java/xls/db.conf");
buff = new BufferedReader(new InputStreamReader(fi));
i = 0;
while ((line = buff.readLine()) != null) {
lines[i] = line;
i++;
}
String host = lines[1].trim();
String baseDeDados = lines[3].trim();
String usuario = lines[5].trim();
String senha = lines[7].trim();
con = DriverManager.getConnection("jdbc:mysql://" + host + "/" + baseDeDados, usuario, senha);
} catch (Exception erro1) {
System.out.println("Erro de arquivo - " + erro1);
}
}
}[/code]
Classe da Tabela Modelo:
[code]/**
- @author Luciano Santos
-
@site www.analisedesistemas.wordpress.com
*/
package escola;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.table.AbstractTableModel;
public class TabelaModelo extends AbstractTableModel {
private ConexaoDB conexao;
private Statement instrucao;
private ResultSet rs;
private ResultSetMetaData metaData;
private int numberOfRows;
public TabelaModelo(String busca) throws SQLException {
conexao = new ConexaoDB(); // conecta-se ao banco de dados
instrucao = conexao.con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); // cria Statement para consultar banco de dados
setQuery(busca); // configura consulta e a executa
} // fim do construtor TabelaModelo
@Override // obtém a classe que representa o tipo de coluna
public Class getColumnClass(int column) throws IllegalStateException {
// determina a classe Java de coluna
try {
String className = metaData.getColumnClassName(column + 1);
} catch (Exception erro1) {
System.out.println("Erro ao pegar a classe - " + erro1);
}
return Object.class; // se ocorrerem os problemas acima, assume tipo Object
} // fim do método getColumnClass
@Override // obtém número de colunas em ResultSet
public int getColumnCount() throws IllegalStateException {
// determina número de colunas
try {
return metaData.getColumnCount();
} catch (SQLException erro2) {
System.out.println("Erro ao contar colunas - " + erro2);
}
return 0; // se ocorrerem os problemas acima, retorna 0 para o número de colunas
} // fim do método getColumnCount
@Override // obtém nome de uma coluna particular em ResultSet
public String getColumnName(int column) throws IllegalStateException {
// determina o nome de coluna
try {
return metaData.getColumnName(column + 1);
} // fim do try
catch (SQLException erro3) {
System.out.println("Erro ao pegar nome de coluna - " + erro3);
} // fim do catch
return ""; // se ocorrerem problemas, retorna string vazia para nome de coluna
} // fim do método getColumnName
@Override // retorna número de linhas em ResultSet
public int getRowCount() throws IllegalStateException {
return numberOfRows;
} // fim do método getRowCount
@Override // obtém valor na linha e coluna particular
public Object getValueAt(int row, int column) throws IllegalStateException {
// obtém um valor na linha e coluna de ResultSet especificada
try {
rs.absolute(row + 1);
return rs.getObject(column + 1);
} catch (SQLException erro4) {
System.out.println("Erro ao pegar valores - " + erro4);
}
return ""; // se ocorrerem problemas, retorna objeto string vazio
} // fim do método getValueAt
// configura nova string de consulta de banco de dados
public final void setQuery(String query) throws SQLException, IllegalStateException {
// especifica consulta e a executa
rs = instrucao.executeQuery(query);
// obtém metadados para ResultSet
metaData = rs.getMetaData();
// determina o número de linhas em ResultSet
rs.last(); // move para a última linha
numberOfRows = rs.getRow(); // obtém número de linha
// notifica a JTable de que modelo foi alterado
fireTableStructureChanged();
} // fim do método setQuery
public final void setRowCount() {
//zera as linhas
numberOfRows = 0;
fireTableStructureChanged(); // notifica a JTable de que modelo foi alterado
}
// fecha Statement e Connection
public void disconnectFromDatabase() {
// fecha Statement e Connection
try {
instrucao.close();
conexao.con.close();
} catch (SQLException erro5) {
System.out.println("Erro ao desconectar - " + erro5);
}
} // fim do método disconnectFromDatabase
} // fim da classe TabelaModelo [/code]
Classe da interface principal:
[code]package escola;
import java.awt.Font;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
/**
-
@author Luciano Santos
-
@site www.analisedesistemas.wordpress.com
*/
public class GUIEscola extends JFrame {private JLabel lblTitulo, lblRodape, lblFuncionarios;
private JButton btnAlunoAdd, btnAlunoDel, btnAlunoUp, btnAlunoSearch, btnFuncionariosAdd, btnFuncionariosDel, btnFuncionariosUp, btnFuncionariosSearch, btnExit;
private JPanel pnlAlunos, pnlFuncionarios;
private JScrollPane scrollAlu, scrollFun;
private JTable tblAlunos, tblFuncionarios;
static final String CONSULTA_PADRAO = "SELECT * FROM alunos ORDER BY Nome";
private ConexaoDB conexao;
public TabelaModelo modelo, modelo2;private void montarTela() {
lblTitulo = new JLabel("Escola v1.0");
lblTitulo.setBounds(280, 0, 120, 24);
add(lblTitulo);ImageIcon icon = (null); JTabbedPane pnlAba = new JTabbedPane(); pnlAba.setBounds(0, 0, 720, 340); add(pnlAba); pnlAlunos = new JPanel(); pnlAlunos.setLayout(null); pnlAba.addTab("Alunos", icon, pnlAlunos, "Consulte, adicione ou exclua alunos"); selAluno(); scrollAlu = new JScrollPane(tblAlunos); scrollAlu.setBounds(10, 10, 600, 290); pnlAlunos.add(scrollAlu); pnlFuncionarios = new JPanel(); pnlFuncionarios.setLayout(null); pnlAba.addTab("Funcionarios", icon, pnlFuncionarios, "Consulte, adicione ou exclua funcionarios"); selFuncionario(); scrollFun = new JScrollPane(tblFuncionarios); scrollFun.setBounds(10, 10, 600, 290); pnlFuncionarios.add(scrollFun); btnAlunoAdd = new JButton("Adicionar"); btnAlunoAdd.setBounds(620, 20, 75, 20); btnAlunoAdd.setFont(new Font("Sans-serif", Font.PLAIN, 12)); btnAlunoAdd.setMargin(new Insets(0, 0, 0, 0)); pnlAlunos.add(btnAlunoAdd); btnAlunoDel = new JButton("Deletar"); btnAlunoDel.setBounds(620, 50, 75, 20); btnAlunoDel.setFont(new Font("Sans-serif", Font.PLAIN, 12)); btnAlunoDel.setMargin(new Insets(0, 0, 0, 0)); pnlAlunos.add(btnAlunoDel); btnAlunoUp = new JButton("Corrigir"); btnAlunoUp.setBounds(620, 80, 75, 20); btnAlunoUp.setFont(new Font("Sans-serif", Font.PLAIN, 12)); btnAlunoUp.setMargin(new Insets(0, 0, 0, 0)); pnlAlunos.add(btnAlunoUp); btnAlunoSearch = new JButton("Buscar"); btnAlunoSearch.setBounds(620, 110, 75, 20); btnAlunoSearch.setFont(new Font("Sans-serif", Font.PLAIN, 12)); btnAlunoSearch.setMargin(new Insets(0, 0, 0, 0)); pnlAlunos.add(btnAlunoSearch); lblFuncionarios = new JLabel("Funcionarios", SwingConstants.CENTER); lblFuncionarios.setBounds(40, 160, 80, 26); lblFuncionarios.setBorder(BorderFactory.createEtchedBorder()); pnlFuncionarios.add(lblFuncionarios); btnFuncionariosAdd = new JButton("Adicionar"); btnFuncionariosAdd.setBounds(620, 20, 75, 20); btnFuncionariosAdd.setMargin(new Insets(0, 0, 0, 0)); btnFuncionariosAdd.setFont(new Font("Sans-serif", Font.PLAIN, 12)); pnlFuncionarios.add(btnFuncionariosAdd); btnFuncionariosDel = new JButton("Deletar"); btnFuncionariosDel.setBounds(620, 50, 75, 20); btnFuncionariosDel.setMargin(new Insets(0, 0, 0, 0)); btnFuncionariosDel.setFont(new Font("Sans-serif", Font.PLAIN, 12)); pnlFuncionarios.add(btnFuncionariosDel); btnFuncionariosUp = new JButton("Atualizar"); btnFuncionariosUp.setBounds(620, 80, 75, 20); btnFuncionariosUp.setMargin(new Insets(0, 0, 0, 0)); btnFuncionariosUp.setFont(new Font("Sans-serif", Font.PLAIN, 12)); pnlFuncionarios.add(btnFuncionariosUp); btnFuncionariosSearch = new JButton("Buscar"); btnFuncionariosSearch.setMargin(new Insets(0, 0, 0, 0)); btnFuncionariosSearch.setBounds(620, 110, 75, 20); btnFuncionariosSearch.setFont(new Font("Sans-serif", Font.PLAIN, 12)); pnlFuncionarios.add(btnFuncionariosSearch); lblRodape = new JLabel("Criado por Luciano Santos", SwingConstants.CENTER); lblRodape.setBounds(10, 350, 260, 26); lblRodape.setBorder(BorderFactory.createEtchedBorder()); add(lblRodape); btnExit = new JButton("Sair"); btnExit.setBounds(275, 350, 102, 26); add(btnExit);
}
public final void selAluno() {
try {
modelo = new TabelaModelo(CONSULTA_PADRAO);
} catch (SQLException erro1) {
System.out.println("Erro ao pegar a classe - " + erro1);
// assegura que a conexão de banco de dados está fechada
modelo.disconnectFromDatabase();
System.exit(1); // termina o aplicativo
}
tblAlunos = new JTable(modelo);
tblAlunos.setBounds(10, 10, 600, 290);
tblAlunos.setBorder(BorderFactory.createEtchedBorder());
pnlAlunos.add(tblAlunos);
}public final void selFuncionario() {
try { modelo2 = new TabelaModelo("SELECT * FROM funcionarios ORDER BY idFuncionario"); } catch (SQLException erro2) { System.out.println("Erro ao fazer consulta - " + erro2); // assegura que a conexão de banco de dados está fechada modelo.disconnectFromDatabase(); System.exit(1); // termina o aplicativo } tblFuncionarios = new JTable(modelo2); tblFuncionarios.setBounds(10, 10, 600, 290); tblFuncionarios.setBorder(BorderFactory.createEtchedBorder()); pnlFuncionarios.add(tblFuncionarios);
}
public class Sair implements ActionListener {
@Override public void actionPerformed(ActionEvent ev) { dispose(); }
}
GUIEscola() {
setTitle("Escola v1.0");
setSize(720, 420);
setLocationRelativeTo(null);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setLayout(null);
montarTela();
try {
conexao = new ConexaoDB();
} catch (Exception erro3) {
System.out.println("Erro de conexao" + erro3);
}btnAlunoAdd.addActionListener(new AddAluno()); btnAlunoDel.addActionListener(new DelAluno()); btnExit.addActionListener(new Sair());
}
public class AddAluno implements ActionListener {
addAluno tela;@Override public void actionPerformed(ActionEvent ev) { if (tela == null) { tela = new addAluno(); modelo.setRowCount(); } tela.setVisible(true); }
}
public class DelAluno implements ActionListener {
@Override public void actionPerformed(ActionEvent ev) { String confirma = JOptionPane.showInputDialog("Digite o id do aluno a ser excluido."); try { // cria um preparedStatement PreparedStatement pStmt = conexao.con.prepareStatement("Delete from alunos where idAluno = (?)"); // preenche os valores pStmt.setString(1, confirma); // executa pStmt.execute(); pStmt.close(); lblRodape.setText("Linha deletada"); conexao.con.close(); } catch (SQLException erro4) { System.out.println("Erro ao deletar - " + erro4); // assegura que a conexão de banco de dados está fechada modelo.disconnectFromDatabase(); System.exit(1); // termina o aplicativo } }
}
public static void main(String[] args) {
GUIEscola exm = new GUIEscola();
exm.setVisible(true);
}
}[/code]
Classe do botão adicionar:
[code]/**
- @author Luciano Santos
-
@site www.analisedesistemas.wordpress.com
*/
package escola;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.text.ParseException;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.text.MaskFormatter;
public class addAluno extends JFrame {
private JLabel lblRodape, lblIdAluno, lblNome, lblTelefone, lblMensalidade;
private JTextField txtIdAluno, txtNome, txtMensalidade;
private JButton btnIncluir;
private MaskFormatter mskTelefone;
private JFormattedTextField fTxtTelefone;
private ConexaoDB conexao;
private Statement instrucao;
private ResultSet rs;
private GUIEscola atual;
addAluno() {
setTitle("Adicionar novo aluno");
setSize(500, 120);
setLocationRelativeTo(null);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setLayout(null);
montarTela();
setVisible(true);
try {
conexao = new ConexaoDB();
instrucao = (Statement) conexao.con.createStatement();
} catch (Exception exe) {
System.out.println("Erro de conexao");
}
}
private void montarTela() {
lblIdAluno = new JLabel("idAluno");
lblIdAluno.setBounds(10, 3, 100, 24);
add(lblIdAluno);
lblNome = new JLabel("Nome");
lblNome.setBounds(85, 3, 180, 24);
add(lblNome);
lblTelefone = new JLabel("Telefone");
lblTelefone.setBounds(275, 3, 120, 24);
add(lblTelefone);
lblMensalidade = new JLabel("Mensalidade");
lblMensalidade.setBounds(390, 3, 120, 24);
add(lblMensalidade);
lblRodape = new JLabel("");
lblRodape.setBounds(10, 56, 400, 24);
add(lblRodape);
txtIdAluno = new JTextField();
txtIdAluno.setBounds(10, 28, 65, 24);
add(txtIdAluno);
txtNome = new JTextField();
txtNome.setBounds(85, 28, 180, 24);
add(txtNome);
try {
mskTelefone = new MaskFormatter("(##)####-####");
} catch (ParseException telefone) {
System.out.println("Telefone invalido");
}
fTxtTelefone = new JFormattedTextField(mskTelefone);
fTxtTelefone.setBounds(275, 28, 110, 24);
add(fTxtTelefone);
txtMensalidade = new JTextField();
txtMensalidade.setDocument(new Moeda());
txtMensalidade.setBounds(400, 28, 90, 24);
add(txtMensalidade);
btnIncluir = new JButton("Incluir");
btnIncluir.setBounds(380, 58, 102, 26);
add(btnIncluir);
txtIdAluno.addKeyListener(new Limitar());
btnIncluir.addActionListener(new IncluirAluno());
btnIncluir.addFocusListener(new MaisUm());
}
public class IncluirAluno implements ActionListener {
@Override
public void actionPerformed(ActionEvent ev) {
String a = txtMensalidade.getText().replaceAll("\\.", "");
try {
// cria um preparedStatement
PreparedStatement pStmt = conexao.con.prepareStatement("INSERT INTO alunos VALUES(?,?,?,?)");
// preenche os valores
pStmt.setString(1, txtIdAluno.getText());
pStmt.setString(2, txtNome.getText());
pStmt.setString(3, fTxtTelefone.getText());
pStmt.setString(4, a.replaceAll(",", "."));
// executa
pStmt.execute();
pStmt.close();
lblRodape.setText("1 Linha adicionada");
conexao.con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public class MaisUm implements FocusListener {
@Override
public void focusLost(FocusEvent e) {
lblRodape.setText("");
txtIdAluno.setText("");
txtNome.setText("");
fTxtTelefone.setText("");
txtMensalidade.setText("");
txtIdAluno.requestFocus();
}
@Override
public void focusGained(FocusEvent e) {
}
}
public class Limitar implements KeyListener {
@Override
public void keyTyped(KeyEvent e) {
int k = e.getKeyChar();
if (txtIdAluno.getText().length() < 6) {
//deixe passar
} else {
e.setKeyChar((char) KeyEvent.VK_CLEAR);
}
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
}
}[/code]
Classe de formatação do campo em moeda Mensalidade:
[code]/**
- @author Dantalian
-
@site http://www.guj.com.br/
*/
package escola;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public class Moeda extends PlainDocument {
public static final int NUMERO_DIGITOS_MAXIMO = 9;
@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
String texto = getText(0, getLength());
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (!Character.isDigit(c)) {
return;
}
}
if (texto.length() < Moeda.NUMERO_DIGITOS_MAXIMO) {
super.remove(0, getLength());
texto = texto.replace(".", "").replace(",", "");
StringBuilder valor = new StringBuilder(texto + str);
if (valor.length() > 0 && valor.charAt(0) == '0') {
valor.deleteCharAt(0);
}
if (valor.length() < 3) {
if (valor.length() < 1) {
valor.insert(0, "000");
} else if (valor.length() < 2) {
valor.insert(0, "00");
} else {
valor.insert(0, "0");
}
}
valor.insert(valor.length() - 2, ",");
if (valor.length() > 6) {
valor.insert(valor.length() - 6, ".");
}
if (valor.length() > 10) {
valor.insert(valor.length() - 10, ".");
}
super.insertString(0, valor.toString(), a);
}
}
@Override
public void remove(int offset, int length) throws BadLocationException {
super.remove(offset, length);
String texto = getText(0, getLength());
texto = texto.replace(",", "");
texto = texto.replace(".", "");
super.remove(0, getLength());
insertString(0, texto, null);
}
}[/code]
Já não sei o que pesquisar pra atualizar o conteudo da tabela, espero que possam me ajudar…