Problema com calculadora

11 respostas
Rauel

Eai galera montei uma calculadora e ela tá funcionando direitinho só que foi pedido para que o usuário n pudesse usar o mouse, somente o teclado né até ai de boa fácil usei o keylistener(keypressed), quando o usuario pressiona um numero ocorre certinho mais quando ele pressiona um simbolo de operação n vai…

exemplo : quero somar 1 + 1 quando aperto o simbolo de soma ele n limpa a tela e assim gera erro…

alguém sabe me dá uma dica como eu faço para que isso funfe ?

vlw

11 Respostas

V

Olá ,

se você mostrar o código fica mais fácil de responder, como eu não sei o que você fez vou tentar dar um palpite.

na implementação do seu event listener tente pegar o keyChar que está sendo retornado, eu acredito que você está tentando comparar com o keyCode e tentando comparar com o VKCode (não sei isso é um palpite).

Tente algo assim na implementacao do seu KeyListener

public void keyPressed(KeyEvent e) {
				System.out.println(e);
                                                               if(e.getKeyChar() == '/'){
                                                                        facaADivisao();
                                                                }
                                                                else if(e.getKeyChar() == '+'){
                                                                         facaASoma();
                                                                 }
                                                                else if(e.getKeyChar() == '-'){
                                                                         facaASubtracao();
                                                                 }
                                                                else if(e.getKeyChar() == '*'){
                                                                         facaAMultiplicacao();
                                                                 }
                                                                 

                                                                  //facaAlgumaCoisa tipo tratar os números
                                                              

                                               }

se não for isso que você quer mande o código que eu te dou uma ajuda.

Rauel

eu n expliquei muito bem o problema…

é assim criei um calculadora e ela está funcionando total mas na base do click com o mouse todas as operações(soma, divisão e etc) ai foi pedido para que o usuaário não usasse o mouse somente o teclado então utilizei a opção keyListener(keyPressed) para quando o usuário pressionar a tecla exemplo o n[umero 1 apareça o 1 na tela só que quando ele pressiona exemplo o sinal de adição o “+” ela n limpa a tela como limpava no click do mouse para que possa ser inserido o proximo numerop para efetuar a operação e assim dá esse erro pq o certo seria o usuário pressionar o 1 e depois o “+” limpar a tela para que seja recebido o proximo numero e asssim gerar op resultado mais isso n acontece quando eu pressiono o 1° numero mais o sinal de operação a tela n limpa ai fica assim EX: 1 +1 e n reconhece isso…

metodo que limpa a tela no actionperformed:

private void numeroDig(String numero) {
        aux = jTVisor.getText();
        nantes = aux;
        aux = aux + numero;
        jTVisor.setText(aux);
    }

Metodo que ver qual operador foi selecionado no action performed:

private void escolheOpe(char ope) throws NumberFormatException {
        operacao = ope;
        num1 = Double.parseDouble(jTVisor.getText());
        jTVisor.setText("");
    }

ai no botão de igualdade eu realizo a operação com o seguinte codigo:

num2= Double.parseDouble(jTVisor.getText());
        
        switch(operacao){
            
            case '+':
                    resu = num1 + num2;
                  break;
            case '-':
                    resu = num1 - num2;
                  break;
            case '*':
                    resu = num1 * num2;
                  break;
             case '/':
                    resu = num1 / num2;
                  break;    
        }
        jTVisor.setText(String.valueOf(resu));
pmlm

Quando ele pressiona a tecla “+” do teclado só tens de fazer exactamente o mesmo que já fazes para quando ele pressiona o botão “+”

Rauel

pmlm:
Rauel:

é assim criei um calculadora e ela está funcionando total mas na base do click com o mouse todas as operações(soma, divisão e etc) ai foi pedido para que o usuaário não usasse o mouse somente o teclado então utilizei a opção keyListener(keyPressed) para quando o usuário pressionar a tecla exemplo o n[umero 1 apareça o 1 na tela só que quando ele pressiona exemplo o sinal de adição o “+” ela n limpa a tela como limpava no click do mouse para que possa ser inserido o proximo numerop para efetuar a operação e assim dá esse erro pq o certo seria o usuário pressionar o 1 e depois o “+” limpar a tela para que seja recebido o proximo numero e asssim gerar op resultado mais isso n acontece quando eu pressiono o 1° numero mais o sinal de operação a tela n limpa ai fica assim EX: 1 +1 e n reconhece isso…

Quando ele pressiona a tecla “+” do teclado só tens de fazer exactamente o mesmo que já fazes para quando ele pressiona o botão “+”

isso ai msm que eu to querendo só qu en consigo to quebrando a cabeça já tentei de várias formas mais nda até agora :confused:

L

quer um exemplo que fiz de calculadora é bem simples? se quiser eu post e vc vê o que esta errado do seu.

vc decide…rs

Rauel

a sua calculadora tá igual oq eu estou qurendo ai, as funções sendo operadas no teclado

L

Em vez de passar vo te dar uma dica !

Use um KeyEvent!Não esquecendo de adicionar seu componente a um
KeyListener... :wink:

Exemplo:

//---Eventos do teclado   
   public void keyTyped(KeyEvent ke){   
         }   
   public void keyReleased(KeyEvent ke){   
      }   
   public void keyPressed(KeyEvent ke){   
     if(ke.getKeyCode() == ke.VK_ENTER){    
           componente = (Component) ke.getSource();    
           componente.transferFocus();   
           componente=null;     
       }     
                                        }

Esse trecho é para transferir o foco qdo for teclado ENTER!
vc deve implementar a interface KeyListener e adicionar seus componentes tipo TextField.addKeyListener(this);

Rauel

eu já usei esse keypressed ai e não deu certo kra

Rauel
public void keyTyped(KeyEvent ke){   
         }   
   public void keyReleased(KeyEvent ke){   
      }

pra que serve esses 2 metodos ai?

L

Cara dá uma olhada no exmplo do ViniGodoy

http://www.guj.com.br/java/140986-como-acionar-os-botoes-de-uma-calculadora-atraves-do-teclado

acho que nesse exemplo pode ser a luz do seu problema

valeu!

V

Oi,

O keyTyped(KeyEvent e) é disparado quando você aperta a tecla, ou seja quando ela “afunda”, o KeyRelesed(KeyEvent e) é disparado quando você solta a tecla, ou seja quando ela “volta pra cima” e o KeyPressed(KeyEvent e) é chamado periódicamente enquanto a tecla está pressionada.

a lógica da sua calculadora vai continuar exatamente a mesma, inclusive ela vai continuar funcionando com o mouse, vamos ao raciocínio.

o que provavelmente você faz atualmente:

1 - o usuário entra com os números clicando nas teclas,
2 - o usuário escolhe uma operação
3 - você guarda o primeiro valor em uma variável e a operação em outra
4 - o usuário entra com o segundo valor
5 - o usuário clica em igual
6 - você pega o valor do segunda número, efetua a operação escolhida, e devolve o resultado

essa sequência de passos não vai mudar, a unica coisa é que você vai implementar um KeyListenner

vou te mandar um exemplo bem simples pra você ter uma idéia do que você tem que fazer

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Arrays;

import javax.swing.JFrame;
import javax.swing.JTextField;




public class SimpleCalc extends JFrame {

	private double n1;
	private double n2;
	private char op;
	private JTextField visor;
	private static char[] opValidas = {'+','-','/','*'};
	private boolean limpa = false;

	
	public SimpleCalc() {
		visor = new JTextField();
		this.getContentPane().add(visor);
		Arrays.sort(opValidas);
		
		visor.addKeyListener(new KeyListener() {
			
			
			
			@Override
			public void keyTyped(KeyEvent e) {

				
				if(limpa){
					visor.setText("");
					limpa = false;
					n1 = 0;
					n2 = 0;
					op = ' ';
				}

				if(Arrays.binarySearch(opValidas, e.getKeyChar())> -1 
						|| e.getKeyChar() == KeyEvent.VK_ENTER){
					System.out.println(n1);
					if(n1 == 0){
						n1 = Double.parseDouble(visor.getText());
						op = e.getKeyChar();
						visor.setText("");
					}
					else{
						
						n2 = Double.parseDouble(visor.getText().substring(1));
						System.out.println(op);
						switch(op){
							case '+':
								n1+=n2;
								break;
							case '-':
								n1-=n2;
								break;
							case '*':
								n1*=n2;
								break;
							case '/':
								n1/=n2;
								break;
						}
						visor.setText(n1+"");
						limpa = true;
					}
					
				}
			}
			
			@Override
			public void keyReleased(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void keyPressed(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
		});
		this.setSize(200,50);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}
	
	public static void main(String[] args) {
		new SimpleCalc();
	}

}

para testar, digite um número, em seguida digite uma operação matemática, digite outro número e aperte enter.

como é só um exemplo eu não estou tratando exceções.

Criado 17 de maio de 2011
Ultima resposta 18 de mai. de 2011
Respostas 11
Participantes 4