Tratar vários eventos de botões em um for

14 respostas
Mus4shi

Pessoal, estou fazendo um trabalho para a faculdade onde tenho que fazer uma calculadora com interface gráfica, e tenho que tratar os botões.
E como eu fiz um vetor para armazenar os botões, queria saber se tem como eu tratar os botões de uma vez dentro de um for, já que o evento seria o mesmo. (neste caso, era só para escrever o valor do botão pressionado no textfield).

Vou colocar o código que fiz até agora, ok.

import java.awt.*;
import java.awt.event.*;
import java.awt.ComponentOrientation;

public class JanelaGrafica extends Frame{
	private Panel lateral, base, valores;
	private Button numeros[];
	private TextField topo;
	
	public JanelaGrafica(){
		super("Calculadora");
		
		setBounds(450,200,250,250);
		
		addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
		//Vetor com os botões de números da calculadora
		numeros = new Button[10];
		
		//Cria os componentes
		topo = new TextField(10);
		//topo.setLayout(new FlowLayout());
		//topo.add(new TextField(40));
		
		valores = new Panel();
		valores.setLayout(new GridLayout(4,3,5,5));
		// Mudar a ordem de inserção dos botões para ficar semelhante a calculadora
		// do Windows.
		ComponentOrientation o = null;
		ComponentOrientation y = null;
		valores.setComponentOrientation(o.RIGHT_TO_LEFT); //Mudando a orientação.
		
		for(int i=9; i>=0;i--){
			numeros[i] = new Button(Integer.toString(i));
			valores.add(numeros[i]);
		}
		
		
		base = new Panel();
		base.setLayout(new GridLayout(1,1));
		base.add(new Button("="));
		
	
		lateral = new Panel();
		lateral.setLayout(new GridLayout(4,1,5,5));
		lateral.add(new Button("/"));
		lateral.add(new Button("*"));
		lateral.add(new Button("+"));
		lateral.add(new Button("-"));
		
		
		
		//Define o layout do container básico
		setLayout(new BorderLayout());
		
		//Adiciona os panels ao container básico
		add(topo, BorderLayout.NORTH);
		add(valores, BorderLayout.CENTER);
		add(lateral, BorderLayout.EAST);
		add(base, BorderLayout.SOUTH);
		
		//TRATANDOS OS EVENTOS DOS BOTÕES
		
		for(int i=0; i<10; i++){
			numeros[i].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					String aux;
					aux = topo.getText();
					topo.setText(aux + numeros[i].getLabel()); // aqui que da o erro.
				}
			});
		}
		
		
	}	
}

Minha dúvida está a partir da linha 63.

Muito Obrigado.

14 Respostas

marcosharbs

bem vc vai estar criando varias vezes o metodo actionPerformed acho que isso não vai ser possível

Mus4shi

Até que ele não deu erro nisso, pois se eu trocar a variável ‘i’ por um valor, por exemplo 0, ele deixa todos os botões com o mesmo evento.

marcosharbs

tp acho que vc tera um evento para cada botao separadamente, oque vc pode fazer é fazer um metodo para escrever o valor dakele botao no textfiled e chamar esse metodo dentro do evento dos botoes.

Mus4shi

Mas como eu saberia em qual botão está ocorrendo o evento ?

marcosharbs

passa pro metodo um parametro um int pode se, se vc passa um ta nu botao 1 se 2 no botao 2 e assim por diante.

Mus4shi

Ta, mas quem chamaria este método ?
E qual objeto chamaria o addActionListener ?

Valew

marcosharbs

pera ai olhei melhor
axo que aquele seu codigo la em cima é possivel de se implementar sim
vo tenta da uma olhada e te do uma resposta depois

marcosharbs

tenta usar esse codigo aqui, ve se da certo:

import java.awt.*;   
import java.awt.event.*;   
import java.awt.ComponentOrientation;   
  
public class JanelaGrafica extends Frame{   
    private Panel lateral, base, valores;   
    private Button numeros[];   
    private TextField topo;
    private String nomeBotao;
       
    
    public String getNomeBotao() {
        return nomeBotao;
    }


    public void setNomeBotao(String nomeBotao) {
        this.nomeBotao = nomeBotao;
    }


    public JanelaGrafica(){   
        super("Calculadora");   
           
        setBounds(450,200,250,250);   
           
        addWindowListener(new WindowAdapter(){   
            public void windowClosing(WindowEvent e){   
                System.exit(0);   
            }   
        });   
        //Vetor com os botões de números da calculadora   
        numeros = new Button[10];   
           
        //Cria os componentes   
        topo = new TextField(10);   
        //topo.setLayout(new FlowLayout());   
        //topo.add(new TextField(40));   
           
        valores = new Panel();   
        valores.setLayout(new GridLayout(4,3,5,5));   
        // Mudar a ordem de inserção dos botões para ficar semelhante a calculadora   
        // do Windows.   
        ComponentOrientation o = null;   
        ComponentOrientation y = null;   
        valores.setComponentOrientation(o.RIGHT_TO_LEFT); //Mudando a orientação.   
           
        for(int i=9; i>=0;i--){   
            numeros[i] = new Button(Integer.toString(i));   
            valores.add(numeros[i]);   
        }   
           
           
        base = new Panel();   
        base.setLayout(new GridLayout(1,1));   
        base.add(new Button("="));   
           
       
        lateral = new Panel();   
        lateral.setLayout(new GridLayout(4,1,5,5));   
        lateral.add(new Button("/"));   
        lateral.add(new Button("*"));   
        lateral.add(new Button("+"));   
        lateral.add(new Button("-"));   
           
           
           
        //Define o layout do container básico   
        setLayout(new BorderLayout());   
           
        //Adiciona os panels ao container básico   
        add(topo, BorderLayout.NORTH);   
        add(valores, BorderLayout.CENTER);   
        add(lateral, BorderLayout.EAST);   
        add(base, BorderLayout.SOUTH);   
           
        //TRATANDOS OS EVENTOS DOS BOTÕES   
           
        for(int i=0; i<10; i++){  
            setNomeBotao(numeros[i].toString());
            numeros[i].addActionListener(new ActionListener(){ 
                public void actionPerformed(ActionEvent e){   
                    topo.setText(getNomeBotao());
                }   
            });   
        }   
           
           
    }     
}
marcosharbs

desconsidere o codigo acima, tente este aqui, testei ele e está funcioando, realmente vc vai ter que criar um evento para cada botao separadamente como fiz no codigo abaixo:

import java.awt.*;   
import java.awt.event.*;   
import java.awt.ComponentOrientation;   
  
public class JanelaGrafica extends Frame{   
    private Panel lateral, base, valores;   
    private Button numeros[];   
    private TextField topo;
    private String nomeBotao;
       
    
    public String getNomeBotao() {
        return nomeBotao;
    }


    public void setNomeBotao(String nomeBotao) {
        this.nomeBotao = nomeBotao;
    }


    public JanelaGrafica(){  
        
        
        super("Calculadora");   
           
        setBounds(450,200,250,250); 
        
        valores = new Panel();   
        valores.setLayout(new GridLayout(4,3,5,5));   
        // Mudar a ordem de inserção dos botões para ficar semelhante a calculadora   
        // do Windows.   
        ComponentOrientation o = null;   
        ComponentOrientation y = null;   
        valores.setComponentOrientation(o.RIGHT_TO_LEFT); //Mudando a orientação.  
        
        //Vetor com os botões de números da calculadora   
        numeros = new Button[10]; 
        
        for(int i=9; i>=0;i--){   
            numeros[i] = new Button(Integer.toString(i));   
            valores.add(numeros[i]);   
        }
        
        addWindowListener(new WindowAdapter(){   
            public void windowClosing(WindowEvent e){   
                System.exit(0);   
            }   
        });   
         
        
        //Inicio dos eventos de botao
        numeros[0].addActionListener(new ActionListener(){ 
            public void actionPerformed(ActionEvent e){   
                topo.setText(numeros[0].toString());
            }   
        });
        numeros[1].addActionListener(new ActionListener(){ 
            public void actionPerformed(ActionEvent e){   
                topo.setText(numeros[1].toString());
            }   
        });
        numeros[2].addActionListener(new ActionListener(){ 
            public void actionPerformed(ActionEvent e){   
                topo.setText(numeros[2].toString());
            }   
        });
        numeros[3].addActionListener(new ActionListener(){ 
            public void actionPerformed(ActionEvent e){   
                topo.setText(numeros[3].toString());
            }   
        });
        numeros[4].addActionListener(new ActionListener(){ 
            public void actionPerformed(ActionEvent e){   
                topo.setText(numeros[4].toString());
            }   
        });
        numeros[5].addActionListener(new ActionListener(){ 
            public void actionPerformed(ActionEvent e){   
                topo.setText(numeros[5].toString());
            }   
        });
        numeros[6].addActionListener(new ActionListener(){ 
            public void actionPerformed(ActionEvent e){   
                topo.setText(numeros[6].toString());
            }   
        });
        numeros[7].addActionListener(new ActionListener(){ 
            public void actionPerformed(ActionEvent e){   
                topo.setText(numeros[7].toString());
            }   
        });
        numeros[8].addActionListener(new ActionListener(){ 
            public void actionPerformed(ActionEvent e){   
                topo.setText(numeros[8].toString());
            }   
        });
        numeros[9].addActionListener(new ActionListener(){ 
            public void actionPerformed(ActionEvent e){   
                topo.setText(numeros[9].toString());
            }   
        });
        //
           
        //Cria os componentes   
        topo = new TextField(10);   
        //topo.setLayout(new FlowLayout());   
        //topo.add(new TextField(40));   
   
        base = new Panel();   
        base.setLayout(new GridLayout(1,1));   
        base.add(new Button("="));   
           
       
        lateral = new Panel();   
        lateral.setLayout(new GridLayout(4,1,5,5));   
        lateral.add(new Button("/"));   
        lateral.add(new Button("*"));   
        lateral.add(new Button("+"));   
        lateral.add(new Button("-"));   
           
           
           
        //Define o layout do container básico   
        setLayout(new BorderLayout());   
           
        //Adiciona os panels ao container básico   
        add(topo, BorderLayout.NORTH);   
        add(valores, BorderLayout.CENTER);   
        add(lateral, BorderLayout.EAST);   
        add(base, BorderLayout.SOUTH);   
         
        /*
        //TRATANDOS OS EVENTOS DOS BOTÕES   
           
        for(int i=0; i<10; i++){  
            setNomeBotao(numeros[i].toString());
            numeros[i].addActionListener(new ActionListener(){ 
                public void actionPerformed(ActionEvent e){   
                    topo.setText(getNomeBotao());
                }   
            });   
        }   
        */
           
           
    }     
    
    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new JanelaGrafica().setVisible(true);
            }
        });
    }
}
Mus4shi

tentei aqui, e todos os botões pegavam o mesmo nome (no caso o valor 9)

marcosharbs

sim mas use esse ultimo codigo que te passei, no ultimo post ali, akele ali realmente acontecia isso, no otro codigo fiz um evento separado para cada botao, ai deu certo.

Mus4shi

Assim eu já havia feito =D
Pensei que poderia dar uma enxugada neste código.

Obrigado pela ajuda.

marcosharbs

eh tb tentei fazer o problema dakele codigo de antes é que ele so vai disparar o evento qdo for clicado num botao, ai qdo for clicado eel vai chamar o getNomeBotao e ele ta com valor 9 pq la nu for ele da um setNomeBotao e o ultimo valor é nove, ai todos os botoes vao chamar esse mesmo valor, e nao consigo passar parametros ali, so se a variavel for do tipo final, ai tb nao serve pq vai poder ter so uma valor.

kinow

Olá,

eu costumo utilizar o Design Pattern Command... basicamente é uma Ação que você coloca em um componente e pode inclusive reutilizá-la e as vezes até executá-la sem o componente... enfim... veja o código abaixo.

Abraços!

package br.eti.kinoshita.qdpf;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.ComponentOrientation;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
  
public class JanelaGrafica extends JFrame{  
    private Panel lateral, base, valores;  
    private JButton numeros[];  
    private TextField topo;  
      
    public JanelaGrafica(){  
        super("Calculadora");  
          
        setBounds(450,200,250,250);  
          
        addWindowListener(new WindowAdapter(){  
            public void windowClosing(WindowEvent e){  
                System.exit(0);  
            }  
        });  
        //Vetor com os botões de números da calculadora  
        numeros = new JButton[10];  
          
        //Cria os componentes  
        topo = new TextField(10);  
        //topo.setLayout(new FlowLayout());  
        //topo.add(new TextField(40));  
          
        valores = new Panel();  
        valores.setLayout(new GridLayout(4,3,5,5));  
        // Mudar a ordem de inserção dos botões para ficar semelhante a calculadora  
        // do Windows.  
        ComponentOrientation o = null;  
        ComponentOrientation y = null;  
        valores.setComponentOrientation(o.RIGHT_TO_LEFT); //Mudando a orientação.  
          
        for(int i=9; i>=0;i--){  
            //numeros[i] = new Button();
            JButton b = new JButton();
            Action  a = new CalculadoraBotaoAction(b, topo, Integer.toString(i));
            
            b.setAction( a );
            
            numeros[i] = b;  
            
            valores.add(b);
        }  
          
          
        base = new Panel();  
        base.setLayout(new GridLayout(1,1));  
        base.add(new Button("="));  
          
      
        lateral = new Panel();  
        lateral.setLayout(new GridLayout(4,1,5,5));  
        lateral.add(new Button("/"));  
        lateral.add(new Button("*"));  
        lateral.add(new Button("+"));  
        lateral.add(new Button("-"));  
          
          
          
        //Define o layout do container básico  
        setLayout(new BorderLayout());  
          
        //Adiciona os panels ao container básico  
        add(topo, BorderLayout.NORTH);  
        add(valores, BorderLayout.CENTER);  
        add(lateral, BorderLayout.EAST);  
        add(base, BorderLayout.SOUTH);  
          
        //TRATANDOS OS EVENTOS DOS BOTÕES  
          
       /* for(int i=0; i<10; i++){  
            numeros[i].addActionListener(new ActionListener(){  
                public void actionPerformed(ActionEvent e){  
                    String aux;  
                    aux = topo.getText();  
                    topo.setText(aux + numeros[i].getLabel()); // aqui que da o erro.  
                }  
            });  
        }*/  
          
    }     
    
    public static void main(String[] args) {
		JFrame j = new JanelaGrafica();
		j.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		j.pack();
		j.setLocationRelativeTo(null);
		j.setVisible(true);
	}
}  

class CalculadoraBotaoAction extends AbstractAction 
{
	
	private TextField field_ = null;
	private JButton button_ = null;
	
	public CalculadoraBotaoAction(JButton button, TextField field, String value)
	{
		button_ = button;
		field_ = field;
		
		this.putValue(Action.NAME, value);
	}
	
	public void actionPerformed(ActionEvent e) {
		String aux;  
        aux = field_.getText();  
        field_.setText(aux + button_.getText()); // aqui que da o erro.  
	}
}
Criado 13 de novembro de 2008
Ultima resposta 14 de nov. de 2008
Respostas 14
Participantes 3