Eventos botões

15 respostas
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.

15 Respostas

userguj

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:

D

qual IDE vc utiliza???
pq no netbeans, é só vc montar o ambiente edar dois clicks no botao para fazer o evento…
vlw

gismo

Eclipse.

Não quero usar NetBeans, prefiro o eclipse.

D

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

gismo

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);

	}	

}
augustocolom

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.

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
                 }
      }

}
gismo

Realmente esse seu jeito ficou melhor.

Obrigado.

gismo
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 :(.

ViniGodoy
augustocolom:
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:

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:

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

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.

ViniGodoy

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.

ViniGodoy
Segue o código com todas as correções:
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);
            }
        });
    }
}

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

gismo

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

	}
}
ViniGodoy

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.

gismo

Eu uso o editor de form Jigloo para eclipse, você recomenda qual?

Obrigado.

ViniGodoy

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.

Criado 2 de julho de 2010
Ultima resposta 5 de jul. de 2010
Respostas 15
Participantes 5