Mensagem de uma Classe em outra Classe

Olá galera estou com uma dúvida sou novo em orientação a objetos e estou com dificuldade em um exercicio…

Tenho uma classe chamada Conexao e nela te as seguintes mensagem:

"Classe Conexao - Conectou"
"Classe Conexao - Driver não encontrado"
"Classe Conexao - Falha ao conectar".

eu queria saber como faço pra puxar essas mensagem da classe conexão pra uma JTextField ou JLabel em outra classe que séria meu JFRAME! que séria pra informar o usuário.

public class Conexao {
	
	public Connection con = null;
	private final String DRIVER = "com.mysql.cj.jdbc.Driver";
	private final String DBNAME = "agenda"; 
	private final String URL = "jdbc:mysql://localhost:3306/" + DBNAME;
	private final String LOGIN = "root";
	private final String SENHA = "root";
	
	public boolean abreConexao() {
		try { 						// obrigatorio para conexao com BD
			Class.forName(DRIVER);  // indica qual a CONSTANTE a classe usa
			
			// abertura da conexao com parametros de login e senha  
			con = DriverManager.getConnection(URL, LOGIN, SENHA);
			
			System.out.println("Classe Conexao - Conectou");
			return true;
		} catch (ClassNotFoundException e) {
			System.out.println("Classe Conexao - Driver nao encontrado" + e.toString());
			return false;
		} catch (SQLException e) {
			System.out.println("Classe Conexao - Falha ao conectar" + e.toString());
			return false;
		}
	}
	
	public void fechaConexao() {
		try {
			con.close();
			System.out.println("Classe BD - Desconectou");
		} catch (SQLException e) {			
		}
	}
}

Cara, você pode fazer utilizando o design pattern observer.

2 curtidas

Utilize o padrão de projeto Observer, também chamado de Listener.

Defina uma interface ConexaoListener para sua classe Conexao, essa interface é responsável por receber as notificações que sua classe Conexao gera:

import java.sql.SQLException;

public interface ConexaoListener {

    public void conectou();

    public void driverNaoEncontrado(String nomeDoDriver);

    public void falhaAoConectar(SQLException erro);
    
    public void desconectou();
}

Modifique sua classe Conexao criando um método addListener para permitir que objetos do tipo ConexaoListener sejam registrados.
Modifique também a implementação para chamar os métodos dos objetos ConexaoListener quando necessário:

import java.sql.Connection;
import java.sql.DriverManager;
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";

    private Connection con;

    // lista de listeners desta objeto
    private List<ConexaoListener> listeners = new LinkedList<>();

    public boolean abreConexao() {
        try {
            Class.forName(DRIVER);
            con = DriverManager.getConnection(URL, LOGIN, SENHA);
            conectou(); // notifica os listeners
            return true;
        } catch (ClassNotFoundException e) {
            driverNaoEncontrado(e.getMessage()); // notifica os listeners
            return false;
        } catch (SQLException e) {
            falhaAoConectar(e); // notifica os listeners
            return false;
        }
    }

    public void fechaConexao() {
        try {
            con.close();
            desconectou(); // notifica os listeners
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    // permite registrar um listener à este objeto
    public void addListener(ConexaoListener listener) {
        if (listener != null) {
            listeners.add(listener);
        }
    }

    private void conectou() {
        System.out.println("Classe Conexao - Conectou");
        for (ConexaoListener listener : listeners) {
            listener.conectou();
        }
    }

    private void desconectou() {
        System.out.println("Classe BD - Desconectou");
        for (ConexaoListener listener : listeners) {
            listener.desconectou();
        }
    }

    private void driverNaoEncontrado(String driver) {
        System.out.println("Classe Conexao - Driver nao encontrado: " + driver);
        for (ConexaoListener listener : listeners) {
            listener.driverNaoEncontrado(driver);
        }
    }

    private void falhaAoConectar(SQLException erro) {
        System.out.println("Classe Conexao - Falha ao conectar" + erro.toString());
        for (ConexaoListener listener : listeners) {
            listener.falhaAoConectar(erro);
        }
    }
}

Agora no lugar onde você instanciou a classe Conexao, você pode chamar o método addListener e tratar os eventos de acordo.

Conexao conexao = new Conexao();
conexao.addListener(new ConexaoListener() {

    @Override
    public void falhaAoConectar(SQLException erro) {
        // aqui você pode fazer algo quando houver uma falha ao conectar
    }

    @Override
    public void driverNaoEncontrado(String nomeDoDriver) {
        // aqui você pode fazer algo quando o driver não for encontrado
    }

    @Override
    public void desconectou() {
        // aqui você pode fazer algo quando desconectou
    }

    @Override
    public void conectou() {
        // aqui você pode fazer algo quando conectou 
    }
});
3 curtidas

Qual a diferença de instanciar a ConexaoListener e fazer o implements?

Não dá pra instanciar ConexaoListener pois é uma interface e interfaces são tipos abstratos de dados, assim como classes abstratas.

Quando se escreve algo do tipo:

NomeDaInterface objeto = new NomeDaInterface() {

    // metodos da interface
};

Ou quando se passa um parâmetro assim:

nomeDoMetodo(new NomeDaInterface() {

    // metodos da interface
});

Não se está instanciando a interface mas sim instanciando uma classe anônima que implementa aquela interface.

Por que anônima?
Porque em nenhum momento foi definido o nome da classe que implementa a interface.

Quando você implementa a interface, aí você tem a definição da classe e não é mais uma classe anônima:

class NomeDaClasse implements NomeDaInterface {

    // métodos da interface
}

Aí você pode obter instâncias da interface a partir dos objetos da classe que a implementa, assim:

NomeDaInterface objeto = new NomeDaClasse();

Utilizar classes anônimas é uma forma de não expôr a implementação da interface.
Se sua classe implementar a interface, ela passará a ter os métodos da interface que implementa e esses métodos obrigatoriamente são públicos.

Uma expressão lâmbda por exemplo, nada mais é do que uma sintaxe reduzida para criar classes anônimas para interfaces que definem um único método.

3 curtidas

Ahhhhh entendi! Eu ia perguntar isso agora, sobre obrigatoriamente ter todos os métodos! Valeu pela explicação!!

1 curtida

Você pode criar uma classe abstrata que implementa a interface e os métodos não fazem nada, por exemplo:

import java.sql.SQLException;

public abstract class AbstractConexaoListener implements ConexaoListener {

    @Override
    public void conectou() { /* implementação padrão não faz nada */ }

    @Override
    public void driverNaoEncontrado(String nomeDoDriver) { /* implementação padrão não faz nada */ }

    @Override
    public void falhaAoConectar(SQLException erro) { /* implementação padrão não faz nada */ }

    @Override
    public void desconectou() { /* implementação padrão não faz nada */ }
}

Digamos que você só queira tratar dois métodos da interface ConexaoListener e não todos os quatro, aí você cria uma classe anônima estendendo a AbstractConexaoListener e só sobrescreve os métodos de seu interesse, por exemplo:

Conexao conexao = new Conexao();
conexao.addListener(new AbstractConexaoListener() {

    @Override
    public void conectou() {
        // aqui você pode fazer algo quando conectou 
    }
    
    @Override
    public void desconectou() {
        // aqui você pode fazer algo quando desconectou
    }            
});
1 curtida

Mas da no mesmo, não dá? Eu fiz do primeiro jeito que você passou:

public interface FuncionarioInterface {

    public String retorno();

}

Aí na classe que pega os dados:

@Override
public String retorno() {
    String resposta = null;
    if (response.toString().equals("0")) {
        resposta = nome + ", houve um erro ao registrar, verifique o seu ID e tente novamente!";
    } else if (response.toString().equals("1")) {
        resposta = nome + ", você já realizou a entrada hoje!";
    } else if (response.toString().equals("2")) {
        resposta = "Obrigado " + nome + ", sua entrada foi registrada com sucesso! Tenha um ótimo serviço.";
    }
    return resposta;
}

Mas entendi, caso eu não queria todos os métodos, tem que usar o addListener. Bem legal mesmo, eu sempre usava o implements, então vinha um trilhão de métodos vazios

@staroski eu criei a intefarce conexaoListener

e criei os método na conexão BD. mais to com dificuldade como faço pra puxar uma mensagem que eu queira lá no meu JFRAME na jtextfield?

Posta o código do seu JFrame.

Ai está ele eu quero puxa essas mensagem na JTextField Status…
de preferencia quando o programa for executado já aparecer a mensagem de conectado

txtStatus

import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import com.mysql.cj.exceptions.CJException;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.List;
import javax.swing.JList;
import javax.swing.JOptionPane;
import java.awt.TextArea;
import javax.swing.JSpinner;
import java.awt.Choice;
import java.awt.Button;
import java.awt.Color;
import java.awt.SystemColor;
import javax.swing.UIManager;
import java.awt.event.ActionListener;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.awt.event.ActionEvent;
import javax.swing.JComboBox;
import javax.swing.DefaultComboBoxModel;
import java.awt.Font;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.SwingConstants;
import java.awt.ScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.JScrollPane;

public class BancoDados extends JFrame {

	private JPanel contentPane;
	private JLabel lblNewLabel;
	private JLabel lblNewLabel_1;
	private JLabel lblNewLabel_2;
	private JTextField cod;
	private JTextField nome;
	private JTextField txtStatus;

	/**
	 * 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();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public BancoDados() {
		setResizable(false);
		setTitle("Banco de Dados");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 529, 266);
		contentPane = new JPanel();
		contentPane.setBackground(Color.LIGHT_GRAY);
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		lblNewLabel = new JLabel("C\u00F3digo");
		lblNewLabel.setBounds(43, 79, 113, 14);
		lblNewLabel.setForeground(SystemColor.textHighlightText);
		contentPane.add(lblNewLabel);

		lblNewLabel_1 = new JLabel("Nome:");
		lblNewLabel_1.setBounds(43, 104, 113, 14);
		lblNewLabel_1.setForeground(SystemColor.textHighlightText);
		contentPane.add(lblNewLabel_1);

		lblNewLabel_2 = new JLabel("Tipo:");
		lblNewLabel_2.setBounds(43, 126, 88, 14);
		lblNewLabel_2.setForeground(SystemColor.textHighlightText);
		contentPane.add(lblNewLabel_2);

		cod = new JTextField();
		cod.setBounds(121, 76, 396, 20);
		contentPane.add(cod);
		cod.setColumns(10);

		nome = new JTextField();
		nome.setBounds(121, 101, 396, 20);
		contentPane.add(nome);
		nome.setColumns(10);
		
		JComboBox tipoLeitor = new JComboBox();
		tipoLeitor.setBounds(121, 123, 396, 20);
		tipoLeitor.setModel(new DefaultComboBoxModel(new String[] {"Escolha", "Teste", "Teste"}));
		contentPane.add(tipoLeitor);
		
		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(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				tipoLeitor.setSelectedIndex(0);
				cod.setText("");
				nome.setText("");
				txtStatus.setText("Limpando com Sucesso!");
			
			}
		});
		contentPane.add(btnNovo);
		
		JButton btnConsulta = new JButton("Consulta");
		btnConsulta.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent c) {
				
			}
			
			});
		btnConsulta.setBackground(UIManager.getColor("Button.background"));
		btnConsulta.setBounds(114, 166, 94, 23);
		contentPane.add(btnConsulta);
		
		tipoLeitor.setSelectedIndex(0);
		cod.setText("");
		nome.setText("");
		
		JButton btnAlterar = new JButton("Alterar");
		btnAlterar.setBounds(218, 166, 94, 23);
		btnAlterar.setForeground(SystemColor.textText);
		btnAlterar.setBackground(UIManager.getColor("Button.background"));
		btnAlterar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent c) {
				
			}
				
			});
		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(new ActionListener() {
			public void actionPerformed(ActionEvent c) {
				
			  }
			});
		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(new ActionListener() {
			public void actionPerformed(ActionEvent c) {
				
			}
		});
		contentPane.add(btnGravar);
		
		txtStatus = new JTextField();
		txtStatus.setEditable(false);
		txtStatus.setText("Status...");
		txtStatus.setBounds(10, 206, 507, 20);
		contentPane.add(txtStatus);
		txtStatus.setColumns(10);

		
	}
}

Mas cadê o código onde você instancia sua classe Conexao?

Desculpa @staroski eu acho que não entendi muito bem a parte lá em cima que se disse se poderia fazer um exemplo pra mim na jframe por favor? pra mim entender melhor

Você criou uma classe chamada Conexao, certo?

Como é que se usa essa classe?

Como você estava abrindo a conexão com o banco de dados antes?

A certo eu tenho uma classe chamada acoes aonde fica as funções dos botões, consultar, excluir, alterar, gravar e tava chamando minha classe conexao nas acoes dos botões e quando eu executava alguma função no botão ele conectava no banco entendeu?

Então posta o código atualizado, pois no código que você postou não há nenhum objeto da classe Acoes sendo utilizado nos tratadores de eventos dos botões.

Posta o código dessa classe Acoes, o jeito que você utiliza ela parece estranho.
Você passa parâmetros nos construtores para depois chamar métodos sem parâmetros?

Pôxa, sua classe Acoes tem erro de compilação, seu JFrame instancia ela passando parâmetros errados.
Acho que há problemas maiores no seu código do que entender como funciona um Listener ou Observer.

@staroski bora lá está concertado mandei uns errado sem querer nem percebi só está somente o botão alterar coloquei a classe JFrame / Acoes / Conexao ai embaixo.

JFrame

import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.List;
import javax.swing.JList;
import javax.swing.JOptionPane;
import java.awt.TextArea;
import javax.swing.JSpinner;
import java.awt.Choice;
import java.awt.Button;
import java.awt.Color;
import java.awt.SystemColor;
import javax.swing.UIManager;
import java.awt.event.ActionListener;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.awt.event.ActionEvent;
import javax.swing.JComboBox;
import javax.swing.DefaultComboBoxModel;
import java.awt.Font;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.SwingConstants;
import java.awt.ScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.JScrollPane;

public class BancoDados extends JFrame {

	private JPanel contentPane;
	private JLabel lblNewLabel;
	private JLabel lblNewLabel_1;
	private JLabel lblNewLabel_2;
	private JTextField cod;
	private JTextField nome;
	private JTextField txtStatus;

	/**
	 * 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();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	
	public BancoDados() {
		setResizable(false);
		setTitle("Banco de Dados");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 529, 266);
		contentPane = new JPanel();
		contentPane.setBackground(Color.LIGHT_GRAY);
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		lblNewLabel = new JLabel("C\u00F3digo");
		lblNewLabel.setBounds(43, 79, 113, 14);
		lblNewLabel.setForeground(SystemColor.textHighlightText);
		contentPane.add(lblNewLabel);

		lblNewLabel_1 = new JLabel("Nome:");
		lblNewLabel_1.setBounds(43, 104, 113, 14);
		lblNewLabel_1.setForeground(SystemColor.textHighlightText);
		contentPane.add(lblNewLabel_1);

		lblNewLabel_2 = new JLabel("Tipo:");
		lblNewLabel_2.setBounds(43, 126, 88, 14);
		lblNewLabel_2.setForeground(SystemColor.textHighlightText);
		contentPane.add(lblNewLabel_2);

		cod = new JTextField();
		cod.setBounds(121, 76, 396, 20);
		contentPane.add(cod);
		cod.setColumns(10);

		nome = new JTextField();
		nome.setBounds(121, 101, 396, 20);
		contentPane.add(nome);
		nome.setColumns(10);
		
		JComboBox tipo = new JComboBox();
		tipo.setBounds(121, 123, 396, 20);
		tipo.setModel(new DefaultComboBoxModel(new String[] {"Escolha", "Teste", "Teste"}));
		contentPane.add(tipo);
		
		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(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				tipo.setSelectedIndex(0);
				cod.setText("");
				nome.setText("");
				txtStatus.setText("Limpando com Sucesso!");
			
			}
		});
		contentPane.add(btnNovo);
		
		JButton btnConsulta = new JButton("Consulta");
		btnConsulta.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent c) {

			}
			
			});
		btnConsulta.setBackground(UIManager.getColor("Button.background"));
		btnConsulta.setBounds(114, 166, 94, 23);
		contentPane.add(btnConsulta);
		
		tipo.setSelectedIndex(0);
		cod.setText("");
		nome.setText("");
		
		JButton btnAlterar = new JButton("Alterar");
		btnAlterar.setBounds(218, 166, 94, 23);
		btnAlterar.setForeground(SystemColor.textText);
		btnAlterar.setBackground(UIManager.getColor("Button.background"));
		btnAlterar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent c) {
				
				String tipoT = (String) tipo.getSelectedItem();

				Acoes ac = new Acoes(Integer.parseInt(cod.getText()), nome.getText(), tipoT);
				ac.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(new ActionListener() {
			public void actionPerformed(ActionEvent c) {
	           
			  }
			});
		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(new ActionListener() {
			public void actionPerformed(ActionEvent c) {
				
			}
		});
		contentPane.add(btnGravar);
		
		txtStatus = new JTextField();
		txtStatus.setEditable(false);
		txtStatus.setText("Status...");
		txtStatus.setBounds(10, 206, 507, 20);
		contentPane.add(txtStatus);
		txtStatus.setColumns(10);

		
	}
}

Classe Acoes

import java.awt.List;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;


public class Acoes {	 
		
	//Construtores
	private int cod;
	private String nome;
	private String tipo;


 public Acoes(int codCli) {
	this.cod = codCli;
 }
 
 public Acoes(int codCli, String nomeCli){
	this.cod = codCli;
	this.nome = nomeCli;
 }

 public Acoes(int codCli, String nomeCli, String tipoCli) {
	this.cod = codCli;
	this.nome = nomeCli;
	this.tipo = tipoCli;
 
 }

public void Alterar() {
	
	
	Conexao con = new Conexao();
	
	if (con.abreConexao() ) {  // AQUI EU ABRO O BANCO
		
		try {
			
			String sql = "UPDATE bd SET nome = ?, tipo = ? WHERE cod = ?";
			PreparedStatement stmt = con.con.prepareStatement(sql);
			       
			
			stmt.setString(1, nome);
			stmt.setString(2, tipo);
			stmt.setInt(3, cod);
							
			int LinhasInseridas = stmt.executeUpdate();
			if (LinhasInseridas != 0) {
				JOptionPane.showMessageDialog(null, "Registro Alterado");
			} else {
				JOptionPane.showMessageDialog(null, "Registro Não Encontrado.");
			}					
			
			stmt.close();
			con.fechaConexao();
			
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, "ERROR: " + e.toString());

		}
		
	} else {
		JOptionPane.showMessageDialog(null, "Erro ao conectar");
		}
	}
 }

Classe Conexao

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Conexao {
	
	public Connection con = null;
	private final String DRIVER = "com.mysql.cj.jdbc.Driver";
	private final String DBNAME = "bd"; 
	private final String URL = "jdbc:mysql://localhost:3306/" + DBNAME;
	private final String LOGIN = "root";
	private final String SENHA = "";
	
	public boolean abreConexao() {
		try { 						// obrigatorio para conexao com BD
			Class.forName(DRIVER);  // indica qual a CONSTANTE a classe usa
			
			// abertura da conexao com parametros de login e senha  
			con = DriverManager.getConnection(URL, LOGIN, SENHA);
			
			System.out.println("Classe Conexao - Conectou");
			return true;
		} catch (ClassNotFoundException e) {
			System.out.println("Classe Conexao - Driver nao encontrado" + e.toString());
			return false;
		} catch (SQLException e) {
			System.out.println("Classe Conexao - Falha ao conectar" + e.toString());
			return false;
		}
	}
	
	public void fechaConexao() {
		try {
			con.close();
			System.out.println("Classe BD - Desconectou");
		} catch (SQLException e) {			
		}
	}
}

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!");
    }
}