Primeiramente eu criaria uma classe Cliente
para representar o que eu estou cadastrando e o que eu quero salvar no banco de dados:
public class Cliente {
private int codigo;
private String nome;
private String tipo;
public int getCodigo() {
return codigo;
}
public void setCodigo(int codigo) {
this.codigo = codigo;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getTipo() {
return tipo;
}
public void setTipo(String tipo) {
this.tipo = tipo;
}
}
Apaga a classe Acoes
ela está estranha e armazena atributos a serem salvos, não faz sentido ela ser do jeito que é.
Simplifica a interface ConexaoListener
:
import java.sql.SQLException;
public interface ConexaoListener {
public void mensagem(String mensagem);
public void erro(String mensagem, SQLException erro);
}
Depois dá uma melhorada na classe Conexao
:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
public class Conexao {
private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String DBNAME = "agenda";
private static final String URL = "jdbc:mysql://localhost:3306/" + DBNAME;
private static final String LOGIN = "root";
private static final String SENHA = "root";
// isso aqui é a conexão com o banco, é private pra ficar encapsulado aqui e não ser exposto para as telas
private Connection connection;
// lista de listeners desta objeto
private List<ConexaoListener> listeners = new LinkedList<>();
public boolean abreConexao() {
try {
Class.forName(DRIVER);
connection = DriverManager.getConnection(URL, LOGIN, SENHA);
mensagem("Conectou"); // notifica os listeners
return true;
} catch (ClassNotFoundException e) {
mensagem("Driver nao encontrado: " + e.getMessage()); // notifica os listeners
return false;
} catch (SQLException e) {
erro("Erro ao conectar", e); // notifica os listeners
return false;
}
}
// permite registrar um listener à este objeto
public void addListener(ConexaoListener listener) {
if (listener != null) {
listeners.add(listener);
}
}
public void alterar(Cliente cliente) { // aqui recebe o cliente que foi alterado
try {
String sql = "UPDATE bd SET nome = ?, tipo = ? WHERE cod = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, cliente.getNome());
stmt.setString(2, cliente.getTipo());
stmt.setInt(3, cliente.getCodigo());
int registrosAlterados = stmt.executeUpdate();
if (registrosAlterados != 0) {
mensagem("Registro Alterado"); // notifica os listeners
} else {
mensagem("Registro Não Encontrado."); // notifica os listeners
}
stmt.close();
} catch (SQLException e) {
erro("Erro ao alterar", e); // notifica os listeners
}
}
public void fechaConexao() {
try {
connection.close();
mensagem("Classe BD - Desconectou"); // notifica os listeners
} catch (SQLException e) {
erro("Erro ao fechar", e);
}
}
private void erro(String mensagem, SQLException erro) {
System.out.println(mensagem);
erro.printStackTrace();
for (ConexaoListener listener : listeners) {
listener.erro(mensagem, erro);
}
}
private void mensagem(String mensagem) {
System.out.println(mensagem);
for (ConexaoListener listener : listeners) {
listener.mensagem(mensagem);
}
}
}
E aí tudo fica mais fácil ao implementar sua tela:
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.SystemColor;
import java.sql.SQLException;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
public class BancoDados extends JFrame {
private static final long serialVersionUID = 1;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
BancoDados frame = new BancoDados();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/*
* Classe interna que vai receber as mensagens da classe Conexao e repassar para o txtStatus
*/
private class TratadorEventosConexao implements ConexaoListener {
@Override
public void mensagem(String mensagem) {
txtStatus.setText(mensagem);
}
@Override
public void erro(String mensagem, SQLException erro) {
txtStatus.setText(mensagem + " " + erro.getMessage());
}
}
private JTextField txtCodigo;
private JTextField txtNome;
private JComboBox<String> comboTipo;
private JTextField txtStatus;
// objeto que abstrai o acesso ao banco de dados
private Conexao conexao;
// objeto cliente
private Cliente cliente;
/**
* Create the frame.
*/
public BancoDados() {
setResizable(false);
setTitle("Banco de Dados");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 529, 266);
JPanel contentPane = new JPanel();
contentPane.setBackground(Color.LIGHT_GRAY);
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel lblNewLabel = new JLabel("C\u00F3digo");
lblNewLabel.setBounds(43, 79, 113, 14);
lblNewLabel.setForeground(SystemColor.textHighlightText);
contentPane.add(lblNewLabel);
JLabel lblNewLabel_1 = new JLabel("Nome:");
lblNewLabel_1.setBounds(43, 104, 113, 14);
lblNewLabel_1.setForeground(SystemColor.textHighlightText);
contentPane.add(lblNewLabel_1);
JLabel lblNewLabel_2 = new JLabel("Tipo:");
lblNewLabel_2.setBounds(43, 126, 88, 14);
lblNewLabel_2.setForeground(SystemColor.textHighlightText);
contentPane.add(lblNewLabel_2);
txtCodigo = new JTextField();
txtCodigo.setBounds(121, 76, 396, 20);
contentPane.add(txtCodigo);
txtCodigo.setColumns(10);
txtNome = new JTextField();
txtNome.setBounds(121, 101, 396, 20);
contentPane.add(txtNome);
txtNome.setColumns(10);
comboTipo = new JComboBox<>();
comboTipo.setBounds(121, 123, 396, 20);
comboTipo.setModel(new DefaultComboBoxModel<String>(new String[] { "Escolha", "Teste", "Teste" }));
contentPane.add(comboTipo);
JLabel Title = new JLabel("Banco de Dados");
Title.setBounds(6, 11, 306, 60);
Title.setForeground(SystemColor.window);
Title.setFont(new Font("Tw Cen MT", Font.BOLD, 34));
contentPane.add(Title);
JButton btnNovo = new JButton("Novo");
btnNovo.setBounds(10, 166, 94, 23);
btnNovo.setBackground(UIManager.getColor("Button.background"));
btnNovo.setForeground(SystemColor.textText);
btnNovo.addActionListener(event -> novo());
contentPane.add(btnNovo);
JButton btnConsulta = new JButton("Consulta");
btnConsulta.addActionListener(event -> consultar());
btnConsulta.setBackground(UIManager.getColor("Button.background"));
btnConsulta.setBounds(114, 166, 94, 23);
contentPane.add(btnConsulta);
comboTipo.setSelectedIndex(0);
txtCodigo.setText("");
txtNome.setText("");
JButton btnAlterar = new JButton("Alterar");
btnAlterar.setBounds(218, 166, 94, 23);
btnAlterar.setForeground(SystemColor.textText);
btnAlterar.setBackground(UIManager.getColor("Button.background"));
btnAlterar.addActionListener(event -> alterar());
contentPane.add(btnAlterar);
JButton btnExcluir = new JButton("Excluir");
btnExcluir.setBounds(423, 166, 94, 23);
btnExcluir.setForeground(SystemColor.textText);
btnExcluir.setBackground(UIManager.getColor("Button.background"));
btnExcluir.addActionListener(event -> excluir());
contentPane.add(btnExcluir);
JButton btnGravar = new JButton("Gravar");
btnGravar.setBounds(319, 166, 94, 23);
btnGravar.setForeground(SystemColor.textText);
btnGravar.setBackground(UIManager.getColor("Button.background"));
btnGravar.addActionListener(event -> gravar());
contentPane.add(btnGravar);
txtStatus = new JTextField();
txtStatus.setEditable(false);
txtStatus.setText("Status...");
txtStatus.setBounds(10, 206, 507, 20);
contentPane.add(txtStatus);
txtStatus.setColumns(10);
/*
* inicializa o objeto conexao e registra um listener que vai receber mensagens
*/
conexao = new Conexao();
conexao.addListener(new TratadorEventosConexao());
}
private void alterar() {
// atualiza os campos do cliente
cliente.setCodigo(Integer.parseInt(txtCodigo.getText()));
cliente.setNome(txtNome.getText());
cliente.setTipo((String) comboTipo.getSelectedItem());
// envia o cliente para alteração no banco
conexao.abreConexao();
conexao.alterar(cliente);
conexao.fechaConexao();
}
private void consultar() {
// falta implementar
}
private void excluir() {
// falta implementar
}
private void gravar() {
// falta implementar
}
private void novo() {
cliente = new Cliente(); // cria um novo cliente
comboTipo.setSelectedIndex(0);
txtCodigo.setText("");
txtNome.setText("");
txtStatus.setText("Limpando com Sucesso!");
}
}