Bom dia,
Pessoal eu tenho uma tela com 2 botões, queria fazer um evento para cada botão executar uma função quando fossem acionados…
Como eu faço isso?
Obrigado.
Bom dia,
Pessoal eu tenho uma tela com 2 botões, queria fazer um evento para cada botão executar uma função quando fossem acionados…
Como eu faço isso?
Obrigado.
De uma olhada nesse tópico: http://www.guj.com.br/posts/list/31723.java
se a dúvida persistir, poste-a para que possa ajuda_lo
qual IDE vc utiliza???
pq no netbeans, é só vc montar o ambiente edar dois clicks no botao para fazer o evento…
vlw
Eclipse.
Não quero usar NetBeans, prefiro o eclipse.
hum…não faço interface no eclipse (só quando a professora pedia pra fazer na mão) pq tem que fazer tudo manual…
acoselho vc usar o netbeans que já tem quase tudo pronto e facil de implementar…
n lembro d colocar eventos no eclipse…
vlw
Eu uso eclipse + Jigloo, assim eu sei exatamente o que tem no meu código. E também prefiro o eclipse para trabalhar com projetos…
Consegui fazer, abaixo o código de como eu fiz para caso mais alguem quiser saber…
Obrigado a todos…
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@SuppressWarnings("serial")
public class eventoBotao extends JFrame {
private JLabel lblBotao1;
private JButton btBotao2;
private JLabel lbBotao2;
private JButton btBotao1;
public eventoBotao() {
setTitle("Evento Botão");
this.setSize(319, 248);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
getContentPane().setLayout(null);
final int LARG_DEFAULT = 550;
final int ALT_DEFAULT = 450;
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension screenSize = tk.getScreenSize();
int sl = screenSize.width;
int sa = screenSize.height;
int x = sl / 2 - LARG_DEFAULT / 2;
int y = sa / 2 - ALT_DEFAULT / 2;
this.setBounds(0, 0, 319, 248);
setDefaultCloseOperation(EXIT_ON_CLOSE);
{
lblBotao1 = new JLabel();
getContentPane().add(lblBotao1);
lblBotao1.setText("Botão 1");
lblBotao1.setBounds(19, 19, 61, 16);
}
{
btBotao1 = new JButton();
getContentPane().add(btBotao1);
btBotao1.setText("Botão 1");
btBotao1.setBounds(19, 47, 106, 23);
btBotao1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("teste");
}
}
);
}
{
lbBotao2 = new JLabel();
getContentPane().add(lbBotao2);
lbBotao2.setText("Botão 2");
lbBotao2.setBounds(168, 19, 61, 16);
}
{
btBotao2 = new JButton();
getContentPane().add(btBotao2);
btBotao2.setText("Botão 2");
btBotao2.setBounds(168, 47, 96, 23);
btBotao2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("teste2");
}
}
);
}
}
public static void main(String args[]) {
new eventoBotao().setVisible(true);
}
}
[quote=gismo]Bom dia,
Pessoal eu tenho uma tela com 2 botões, queria fazer um evento para cada botão executar uma função quando fossem acionados…
Como eu faço isso?
Obrigado.[/quote]
Gismo,
Você utilize a interface ActionListener, aconselho estudar um pouco sobre ela, mas resumidamente basta você implementá-la a sua classe, que automaticamente você será obrigado a implementar os métodos abstratos dela, bom, a linha de código seria basicamento isso:
public class EventoBotao implements ActionListener{
JButton bt1;
JButton bt2;
//....Código
//Este método é forçado a ser implementado por estar utilizando a interface ActionListener
public void actionPerformed(ActionEvent e){
if(e.getSource() == bt1){
//Faça isso
}
else if(e.getSource() == bt2){
//então faça isso
}
}
}
Realmente esse seu jeito ficou melhor.
Obrigado.
if(e.getSource() == bt1){
//Faça isso
}
else if(e.getSource() == bt2){
//então faça isso
}
Esse getSource() não retorna o nome do botão, não funcionou assim :(.
O Java dá suporte a vários listeners para que cada um trate independentemente as requisições. É uma bobagem registrar todos os botões para um mesmo listener, se as ações dos botões são diferentes.
Isso não só forçará aquele if horrível testando o getSource(), como deixa o código mais desorganizado e lento.
O ideal é fazer um listener por botão:
[code]bt1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
//Faça isso
}
}));
bt2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
//Faça outra coisa
}
}));
[/code]
Como o gismo já vinha fazendo.
Use um mesmo listener apenas se os botões fizerem ações iguais, como é o caso dos botões de uma calculadora. Aí sim, vc escreve um único listener que copia o texto do botão para o display da calculadora, e registra em todos os botões numéricos, sem a necessidade de um if testando o getSource().
Se você tiver vários botões mapeados para uma mesma ação, considere a possibilidade de criar um Action no lugar de um listener.
gismo, testei seu aplicativo aqui e ele funciona perfeitamente. O botão 1 escreve “teste” e o botão 2 escreve “teste 2”. Qual é a dúvida?
Cuidado que vc está escrevendo no console. Para mostrar uma caixa de texto troque:
System.out.println("Teste");
Para:
JOptionPane.showMessageDialog(eventoBotao.this, "Teste");
Outra coisa, há bastante tempo não é mais necessário usar o Toolkit para centralizar janelas. Você pode trocar todo esse código:
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension screenSize = tk.getScreenSize();
int sl = screenSize.width;
int sa = screenSize.height;
int x = sl / 2 - LARG_DEFAULT / 2;
int y = sa / 2 - ALT_DEFAULT / 2;
this.setBounds(0, 0, 319, 248);
Por esse aqui:
this.setLocationRelativeTo(null);
No lugar do null vc poderia passar outra janela, caso quisesse que essa janela ficasse centralizado em relação à outra (muito comum em JDialogs).
Finalmente, lembre-se que pela convenção de códigos da sun, os nomes de classe devem iniciar por letras maiúsculas.
Segue o código com todas as correções:
[code]
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class EventoBotao extends JFrame {
private JLabel lblBotao1;
private JButton btBotao2;
private JLabel lbBotao2;
private JButton btBotao1;
public EventoBotao() {
setTitle("Evento Botão");
this.setSize(319, 248);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
getContentPane().setLayout(null);
this.setLocationRelativeTo(null);
lblBotao1 = new JLabel();
getContentPane().add(lblBotao1);
lblBotao1.setText("Botão 1");
lblBotao1.setBounds(19, 19, 61, 16);
btBotao1 = new JButton();
getContentPane().add(btBotao1);
btBotao1.setText("Botão 1");
btBotao1.setBounds(19, 47, 106, 23);
btBotao1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(EventoBotao.this, "Teste");
}
});
lbBotao2 = new JLabel();
getContentPane().add(lbBotao2);
lbBotao2.setText("Botão 2");
lbBotao2.setBounds(168, 19, 61, 16);
btBotao2 = new JButton();
getContentPane().add(btBotao2);
btBotao2.setText("Botão 2");
btBotao2.setBounds(168, 47, 96, 23);
btBotao2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(EventoBotao.this, "Teste 2");
}
});
}
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new EventoBotao().setVisible(true);
}
});
}
}[/code]
Você adotou uma boa prática que vejo muita gente desrespeitando no fórum. Jamais chame setVisible(true) no construtor ou no init() do seu JFrame ou JDialog. A decisão de quando o frame deve ser deixado visível deve ser deixada para quem cria a janela, e não para a própria janela em si.
Outra coisa. Lembre-se que é totalmente desaconselhável usar layout null. Como você começou a estudar Swing agora, está ok. Mas não faça nenhuma aplicação comercial séria usando setLayout(null) e setBounds() nos componentes. Os gerenciadores de layout além de deixar seu código mais portável, previnem contra mudanças inesperadas de fonte ou formatação, que tipicamente ocorrem quando o usuário usa um sistema operacional diferente do seu. Sem falar que de graça os gerenciadores fazem todo reposicionamento dos componentes para você, quando o usuário redimensiona a tela.
Fiz como você falou e funcionou.
Segue o código para quem precisar…
Obrigado.
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@SuppressWarnings("serial")
public class eventoBotoes extends JFrame{
private JLabel lblBotao1;
private JButton btBotao2;
private JLabel lbBotao2;
private JButton btBotao1;
public eventoBotoes() {
setTitle("Evento Botão");
this.setSize(319, 248);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
getContentPane().setLayout(null);
this.setLocationRelativeTo(null);
this.setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
{
lblBotao1 = new JLabel();
getContentPane().add(lblBotao1);
lblBotao1.setText("Botão 1");
lblBotao1.setBounds(19, 19, 61, 16);
}
{
btBotao1 = new JButton();
getContentPane().add(btBotao1);
btBotao1.setText("Botão 1");
btBotao1.setBounds(19, 47, 106, 23);
}
{
lbBotao2 = new JLabel();
getContentPane().add(lbBotao2);
lbBotao2.setText("Botão 2");
lbBotao2.setBounds(168, 19, 61, 16);
}
{
btBotao2 = new JButton();
getContentPane().add(btBotao2);
btBotao2.setText("Botão 2");
btBotao2.setBounds(168, 47, 96, 23);
}
btBotao1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
JOptionPane.showMessageDialog(null, "Botão 1!");
}
});
btBotao2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
JOptionPane.showMessageDialog(null, "Botão 2!");
}
});
}
}
O ideal é não passar null no primeiro parâmetro do JOptionPane. Naquele parâmetro, sempre passe quem é a janela pai da caixa de diálogo.
Caso contrário, quando o usuário usar ALT+TAB e sair do seu programa enquanto o dialog da optionpane estiver aberto, o programa não voltará ao dialog caso o usuário volte clicando na janela principal.
Faça o teste. Abra a janela teste, dê alt+tab. Depois, vá na barra do windows e clique sobre a janela pai. Ela estará travada e a caixa de diálogo ficará oculta.
Veja no código de exemplo que fiz acima que passo EventoBotao.this no lugar de null. Essa é a forma de pegar o “this” da classe em que o listener (que é uma classe interna) está. Nele, o problema não acontece. Sem falar que a caixa de diálogo será automaticamente centralizada sobre a janela pai, como é o comum para esses casos, e não sobre o desktop inteiro.
É muito importante seguir à risca todas as recomendações da API do Java, principalmente com o Swing. Evita muitas dores de cabeça.
Eu uso o editor de form Jigloo para eclipse, você recomenda qual?
Obrigado.
Nunca usei o Jigloo. Eu usava o Visual Editor. Não sei se é melhor ou pior.
Muita gente recomenda fazer as telas na mão com o MigLayout.
Mas o importante mesmo é você saber o que está fazendo.