Hola a todos, estoy empezando en este mundo de Java y tengo una duda sobre un
problema que no me funciona como quiero...basicamente he hecho una calculadora pero solo tengo activadas las teclas suma,resta y "="...basicamente lo que quiero es que al restar lo haga correctamente
Mi intencion es que si hago la resta:
-Si resto 0-3 de resultado -3
-Si resto 5-2 de resultado 3
-Si hago 3+2-1 de resultado 4
Ahora mismo los resulados son correcto excepto si resto 0 por un numero..que me da un resultado positivo, en lugar de negativo o tambien ocurre lo mismo si hago 2-2-1-->ya que es 2-2=0 y 0 -un numero me ocurre ese fallo
Estaria muy agradecido si alguien me puede dar una solución para que al restar de cualquier manera, me salga correctamente,sé por qué me falla, pero No tengo una solución para que al restar 0 menos un numero salga correctamente
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class RestaSuma implements ActionListener{
Calculadora ca;
String texto;
static String signo;
static double acumulador=0;
public RestaSuma(Calculadora calcul){
ca=calcul;
}
public boolean existePunto(String cadena){ //Metodo que comprueba si existe un punto en los caracteres introducidos
boolean resultado=false;
for(int i=0;i<cadena.length();i++){
if(cadena.substring(i, i+1).equals(".")){
resultado=true;
break;
}
}
return resultado;
}
public void signoMetodo(String signo){
if(signo.equals("+")){
texto=ca.campo.getText();
acumulador=acumulador+Double.parseDouble(texto);
//¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡EL FALLO ESTÁ AQUI!!!!!!!!!!!!!!!!!!!!!!!!!!!
/*Mi intencion es que si hago la resta:
*
* -Si resto 0-3 de resultado -3
*
* -Si resto 5-2 de resultado 3
*
* -Si hago 3+2-1 de resultado 4
*
*
* Ahora mismo los resulados son correcto excepto si resto 0 por un numero..me da un resultado positivo,
* en lugar de negativo o tambien ocurre lo mismo si hago 2-2-1-->ya que es 2-2=0 y 0 -un numero me ocurre ese fallo
*
*
*
*
*
*/
}else if(signo.equals("-")){
texto=ca.campo.getText();
if(acumulador!=0){
acumulador=acumulador-Double.parseDouble(texto);
}else if(acumulador==0){
double acumulador1=Double.parseDouble(texto);
acumulador=acumulador1-acumulador*-1;
}
}
}
@Override
public void actionPerformed(ActionEvent ev) {
String comando=ev.getActionCommand();
if(comando.equals("1")){
ca.campo.setText(ca.campo.getText()+"1"); //Lo hago de esta manera para que al pulsar
//un numero, el numero que ya estaba en el campo de texto se mantenga
}else if(comando.equals("2")){
ca.campo.setText(ca.campo.getText()+"2");
}else if(comando.equals("3")){
ca.campo.setText(ca.campo.getText()+"3");
}else if(comando.equals("4")){
ca.campo.setText(ca.campo.getText()+"4");
}else if(comando.equals("5")){
ca.campo.setText(ca.campo.getText()+"5");
}else if(comando.equals("6")){
ca.campo.setText(ca.campo.getText()+"6");
}else if(comando.equals("7")){
ca.campo.setText(ca.campo.getText()+"7");
}else if(comando.equals("8")){
ca.campo.setText(ca.campo.getText()+"8");
}else if(comando.equals("9")){
ca.campo.setText(ca.campo.getText()+"9");
}else if(comando.equals("0")){
ca.campo.setText(ca.campo.getText()+"0");
}else if(comando.equals("<==")){ //Aqui borro el ultimo caracter escrito
String cadena=ca.campo.getText();
if(cadena.length()>0){
ca.campo.setText(cadena.substring(0,(cadena.length()-1)));//Con esto lo que hace
//es escribir la cadena desde 0 hasta la longitud de la cadena-1, o sea
//no escribe el ultimo valor, o sea aparentemente borra el ultimo valor
}
}else if(comando.equals(",")){
if(ca.campo.getText().equals("")){
ca.campo.setText("0.");
} else{
if(!existePunto(ca.campo.getText())){
/*el metodo "existePunto" devuelve "true" en caso de existir un punto, si no existe
* entonces escribe el punto
*/
ca.campo.setText(ca.campo.getText()+",");
}
}
}else if(comando.equals("C")){
ca.campo.setText("");
ca.campo1.setText("");
acumulador=0;
}
if(comando.equals("+")){
if(signo==null){
signo="+"; //Esto del "signo" lo hago para así poder continuar sumando o restando a
//una operación ya hecha...por ejemplo si he puesto "5-3"..y quisiera sumarle +4..
//..o sea 5-3+4, al hacerlo de esta manera me funciona correctamente, si no lo hiciera así
//entonces me daría un error...si
//Por ejemplo:
/*empiezo una operación: 5+3..antes de empezar signo=null, despues signo="+"
* y hago la operación 5+3..al terminarla "signo=+"...
*
* continuo la operacion: resto 2 al resultado....o sea 5+3-2
*
* en ese momento el signo actual es "+", pero al pulsar "-" el signo actual pasa a "-"
* y realizo la resta..
*
* Si no lo hiciera de esta manera al hacer una operacion con dos signos diferentes, entonces
* no me la haria correctamente...si pusiera 5+3 y despues "-"2,al pulsar el "-" automaticamente
* me restaría 5-3....ASI QUE ESTA MANERA ES UNA SOLUCION QUE HE ENCONTRADO A ESE PROBLEMA...
* ..PERO IGUALMENTE AQUI NO ESTÁ MI DUDA.
*
*
*
*/
}
signoMetodo(signo);
if(!ca.campo.getText().equals("")){ //Si hay algo escrito en el campo de texto "campo", entonces
//escribe el acumulador en el "campo1" y borra "campo"...(el acumulador ya se ha calculado
//con el metodo "signoMetodo(signo);")
String text;
text=Double.toString(acumulador);
ca.campo.setText("");
ca.campo1.setText(text);
signo="+";
}
}else if(comando.equals("-")){
if(signo==null){
signo="-";
}
signoMetodo(signo);
if(!ca.campo.getText().equals("")){
String text;
text=Double.toString(acumulador);
ca.campo.setText("");
ca.campo1.setText(text);
signo="-";
}
}else if(comando.equals("=")){
if(signo==null){
}
signoMetodo(signo);
if(!ca.campo.getText().equals("")){
String text;
text=Double.toString(acumulador);
ca.campo.setText("");
ca.campo1.setText(text);
acumulador=0;
}
}
}
}
import javax.swing.*;
import java.awt.*;
public class Calculadora extends JFrame{
JPanel principal;
JPanel arriba;
JPanel medio;
JPanel izq;
JPanel der;
JPanel abajo;
JTextField campo;
JTextField campo1;
CalculadoraEventos eventos=new CalculadoraEventos(this);
public Calculadora(){
super("Calculadora");
setSize(400,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Panel principal
principal=new JPanel();
BoxLayout todo=new BoxLayout(principal,BoxLayout.Y_AXIS);
principal.setLayout(todo);
//Primer Panel
arriba=new JPanel();
campo=new JTextField(30);
//campo.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); -->Hace que el cursor esté
//en el campo de texto en el lado derecho en lugar del izquierdo
campo1=new JTextField(30);
campo1.setEditable(false);
arriba.add(campo);
arriba.add(campo1);
//Panel Medio
medio=new JPanel();
medio.setLayout(new GridLayout(1,2,10,10));
//Panel izquierda
izq=new JPanel();
izq.setLayout(new GridLayout(4,3,5,5));
JButton num1=new JButton("1");
JButton num2=new JButton("2");
JButton num3=new JButton("3");
JButton num4=new JButton("4");
JButton num5=new JButton("5");
JButton num6=new JButton("6");
JButton num7=new JButton("7");
JButton num8=new JButton("8");
JButton num9=new JButton("9");
JButton num0=new JButton("0");
JButton coma=new JButton(",");
num1.addActionListener(eventos);
num2.addActionListener(eventos);
num3.addActionListener(eventos);
num4.addActionListener(eventos);
num5.addActionListener(eventos);
num6.addActionListener(eventos);
num7.addActionListener(eventos);
num8.addActionListener(eventos);
num9.addActionListener(eventos);
num0.addActionListener(eventos);
coma.addActionListener(eventos);
izq.add(num1);
izq.add(num2);
izq.add(num3);
izq.add(num4);
izq.add(num5);
izq.add(num6);
izq.add(num7);
izq.add(num8);
izq.add(num9);
izq.add(num0);
izq.add(coma);
//Panel derecha
der=new JPanel();
der=new JPanel();
der.setLayout(new GridLayout(4,3,5,5));
JButton mas=new JButton("+");
JButton menos=new JButton("-");
JButton mult=new JButton("*");
JButton div=new JButton("/");
JButton igual=new JButton("=");
JButton c=new JButton("C");
JButton flecha=new JButton("<==");
mas.addActionListener(eventos);
menos.addActionListener(eventos);
mult.addActionListener(eventos);
div.addActionListener(eventos);
igual.addActionListener(eventos);
c.addActionListener(eventos);
flecha.addActionListener(eventos);
der.add(mas);
der.add(menos);
der.add(mult);
der.add(div);
der.add(igual);
der.add(c);
der.add(flecha);
medio.add(izq);
medio.add(der);
//Panel abajo
abajo=new JPanel();
principal.add(arriba);
principal.add(medio);
principal.add(abajo);
add(principal);
setVisible(true);
}
public static void main(String[]args){
Calculadora cal=new Calculadora();
}
}