Java: Calculadora sencilla en modo gráfico

by Francho Joven

13 Apr 2009

. Comments

Esta es una calculadora sencilla en modo gráfico escrita en Java.

Implementa las operaciones básicas: sumar, restar, multiplicar y dividir

Main.java

/**
* By Francho Joven - http://francho.org/lab/
*
* This work is licensed under the Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/
* or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.
*
*/


package org.francho.java.calculadora;

/**
* Ejercicio: Calculadora sencilla - Implementar la Interfaz de usuario -
* Implementar los mtodos siguientes a través de los listeners adecuados: -
* Sumar - Restar - Multiplicar - Dividir
*
* @author: $Author: franchux $
* @version: $Rev: 70 $
* @date: $Date: 2009-04-13 13:06:00 +0200 (lun 13 de abr de 2009) $ $Id:
* Main.java 70 2009-04-13 11:06:00Z franchux $
*/

public class Main {

/**
* @param args the command line arguments
*/

public static void main(String[] args) {
VentanaCalculadora calculadora = new VentanaCalculadora();
calculadora.setVisible(true);
}
}

VentanaCalculadora.java

/**
* By Francho Joven - http://francho.org/lab/
*
* This work is licensed under the Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/
* or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.
*
*/

package org.francho.java.calculadora;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.border.EmptyBorder;

/**
*
* Interfaz para nuestra calculadora sencilla
*
* @author: $Author: franchux $
* @version: $Rev: 75 $
* @date: $Date: 2009-04-14 00:21:18 +0200 (mar 14 de abr de 2009) $ $Id:
* VentanaCalculadora.java 75 2009-04-13 22:21:18Z franchux $
*/

public class VentanaCalculadora extends JFrame {

/**
* generado
*/

private static final long serialVersionUID = 1583724102189855698L;

/** numero tecleado */
JTextField pantalla;

/** guarda el resultado de la operacion anterior o el número tecleado */
double resultado;

/** para guardar la operacion a realizar */
String operacion;

/** Los paneles donde colocaremos los botones */
JPanel panelNumeros, panelOperaciones;

/** Indica si estamos iniciando o no una operación */
boolean nuevaOperacion = true;

/**
* Constructor. Crea los botones y componentes de la calculadora
*/

public VentanaCalculadora() {
super();
setSize(250, 300);
setTitle("Calculadora Simple");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setResizable(false);

// Vamos a dibujar sobre el panel
JPanel panel = (JPanel) this.getContentPane();
panel.setLayout(new BorderLayout());

pantalla = new JTextField("0", 20);
pantalla.setBorder(new EmptyBorder(4, 4, 4, 4));
pantalla.setFont(new Font("Arial", Font.BOLD, 25));
pantalla.setHorizontalAlignment(JTextField.RIGHT);
pantalla.setEditable(false);
pantalla.setBackground(Color.WHITE);
panel.add("North", pantalla);

panelNumeros = new JPanel();
panelNumeros.setLayout(new GridLayout(4, 3));
panelNumeros.setBorder(new EmptyBorder(4, 4, 4, 4));

for (int n = 9; n >= 0; n--) {
nuevoBotonNumerico("" + n);
}

nuevoBotonNumerico(".");

panel.add("Center", panelNumeros);

panelOperaciones = new JPanel();
panelOperaciones.setLayout(new GridLayout(6, 1));
panelOperaciones.setBorder(new EmptyBorder(4, 4, 4, 4));

nuevoBotonOperacion("+");
nuevoBotonOperacion("-");
nuevoBotonOperacion("*");
nuevoBotonOperacion("/");
nuevoBotonOperacion("=");
nuevoBotonOperacion("CE");

panel.add("East", panelOperaciones);

validate();
}

/**
* Crea un boton del teclado numérico y enlaza sus eventos con el listener
* correspondiente
*
* @param digito
* boton a crear
*/

private void nuevoBotonNumerico(String digito) {
JButton btn = new JButton();
btn.setText(digito);
btn.addMouseListener(new MouseAdapter() {

@Override
public void mouseReleased(MouseEvent evt) {
JButton btn = (JButton) evt.getSource();
numeroPulsado(btn.getText());
}
});

panelNumeros.add(btn);
}

/**
* Crea un botón de operacion y lo enlaza con sus eventos.
*
* @param operacion
*/

private void nuevoBotonOperacion(String operacion) {
JButton btn = new JButton(operacion);
btn.setForeground(Color.RED);

btn.addMouseListener(new MouseAdapter() {

@Override
public void mouseReleased(MouseEvent evt) {
JButton btn = (JButton) evt.getSource();
operacionPulsado(btn.getText());
}
});

panelOperaciones.add(btn);
}

/**
* Gestiona las pulsaciones de teclas numéricas
*
* @param digito
* tecla pulsada
*/

private void numeroPulsado(String digito) {
if (pantalla.getText().equals("0") || nuevaOperacion) {
pantalla.setText(digito);
} else {
pantalla.setText(pantalla.getText() + digito);
}
nuevaOperacion = false;
}

/**
* Gestiona el gestiona las pulsaciones de teclas de operación
*
* @param tecla
*/

private void operacionPulsado(String tecla) {
if (tecla.equals("=")) {
calcularResultado();
} else if (tecla.equals("CE")) {
resultado = 0;
pantalla.setText("");
nuevaOperacion = true;
} else {
operacion = tecla;
if ((resultado > 0) && !nuevaOperacion) {
calcularResultado();
} else {
resultado = new Double(pantalla.getText());
}
}

nuevaOperacion = true;
}

/**
* Calcula el resultado y lo muestra por pantalla
*/

private void calcularResultado() {
if (operacion.equals("+")) {
resultado += new Double(pantalla.getText());
} else if (operacion.equals("-")) {
resultado -= new Double(pantalla.getText());
} else if (operacion.equals("/")) {
resultado /= new Double(pantalla.getText());
} else if (operacion.equals("*")) {
resultado *= new Double(pantalla.getText());
}

pantalla.setText("" + resultado);
operacion = "";
}
}

Actualización 11-11-2011: Subido el código del proyecto a Github Proyecto completo: https://github.com/francho/francho.org-lab/tree/master/0045-CalculadoraJavaGrafica