Eventos botões

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

:smiley:

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. :slight_smile:

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.