Java: Calculadora

Clase Calc
package javaapplication1;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Iterator;

public class Calc extends JFrame{
//============================================================== Constantes
private static final Font FUENTE_GRANDE = new Font("monspaced", Font.PLAIN, 20);
//==== Campos
//.... Componentes referenciados durante la ejecución.
private JTextField _muestraCampo; // Muestra tanto el resultado como la entrada

//... Para representar el estado de la calculadora se usan estados
private boolean _iniciaNumero = true; // true
private String _operacionPrevia = "="; // La operacion anterior
private CalcLogic _logica = new CalcLogic(); // Calculadora interna.

//========================================================= método principal
public static void main(String[] args) {
//.... Coloca el Look and Feel al sistema que en el que estamos
try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception unused) {
; // Ignora la excepción por que no se puede hacer otra cosa.. usaremos el default
}

//.... Crea la ventana
Calc window = new Calc();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}

//============================================================== constructor
public Calc() {
//... Coloca los atributos del campo de display
_muestraCampo = new JTextField("0", 12); //0 es el valor mostrado por default, 12 el tamaño
_muestraCampo.setHorizontalAlignment(JTextField.RIGHT); //Alineación
_muestraCampo.setFont(FUENTE_GRANDE); //Colocamos la fuente

//... Crea y coloca los atributos del botón Limpia.
JButton clearButton = new JButton("Limpia");
clearButton.setFont(FUENTE_GRANDE);
//... Colocamos el listener para borrar el contenido.
clearButton.addActionListener(new ClearListener());

//... Usamos un listener para todas las teclas numericas.
ActionListener numListener = new NumListener();
//... Disposición de las teclas numericas en el grid. Genera los botones
// en un bucle donde se recorren los caracteres en una cadena

String ordenBotones = "789456123 0 ";
JPanel panelBotn = new JPanel();
panelBotn.setLayout(new GridLayout(5, 3, 2, 2));
for (int i = 0; i < ordenBotones.length(); i++) {
String teclasArriba = ordenBotones.substring(i, i+1);
JButton b = new JButton(teclasArriba);
if (teclasArriba.equals(" ")) {
//... Coloca un boton tonto en esta posición
b.setEnabled(false);
} else {
//... Coloca un boton de digitos en la interfaz
b.addActionListener(numListener);
b.setFont(FUENTE_GRANDE);
}
panelBotn.add(b);
}

//... Un ActionListener para usar para todos los botones operadores
ActionListener opListener = new OpListener();

//... Crea un panel con la disposicion para colocar los botones
//... Usa arreglos de nombres de los botones para crear los botones en
//... un ciclo
JPanel panelOperativo = new JPanel();
panelOperativo.setLayout(new GridLayout(5, 1, 2, 2));
String[] opOrder = {"+", "-", "*", "/", "="};
for (int i = 0; i < opOrder.length; i++) {
JButton b = new JButton(opOrder[i]);
b.addActionListener(opListener);
b.setFont(FUENTE_GRANDE);
panelOperativo.add(b);
}

//... Coloca el boton LImpia
JPanel clearPanel = new JPanel();
clearPanel.setLayout(new FlowLayout());
clearPanel.add(clearButton);

//... Dispone el contenido del panel top-level
JPanel contenido = new JPanel();
contenido.setLayout(new BorderLayout(5, 5));
contenido.add(_muestraCampo, BorderLayout.NORTH );
contenido.add(panelBotn , BorderLayout.CENTER);
contenido.add(panelOperativo , BorderLayout.EAST );
contenido.add(clearPanel , BorderLayout.SOUTH );

contenido.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));

//... Termina la construcción del panel
this.setContentPane(contenido);
this.pack();
this.setTitle("Calculadora");
this.setResizable(false);
this.setLocationRelativeTo(null);
}//termina el contructor

//============================================================== actionClear
/** Llamado por la acción del botón limpia.*/
private void actionClear() {
_iniciaNumero = true; // Espera un número no una operación.
_muestraCampo.setText("0");
_operacionPrevia = "=";
_logica.setTotal("0");
}

//================================================= clase interna OpListener
/** Listener para todos los botones operadores. */
class OpListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
// La calculadora siempre esta en uno de dos estados
// 1. Un numero debe ser ingresado - si se ingresa un operador esta mal
// 2. Un operador debe ser ingresado.
if (_iniciaNumero) { // Error: necesitamos un numero, no un operador
//... En este estado estamo esperando un numero, pero se ingreso un operador.
actionClear();
_muestraCampo.setText("ERROR - No operator");
} else {
//... Estamos esperando un operador.
_iniciaNumero = true; // Lo que viene debe ser un numero
try {
// Obtiene los valores del display,
String testoDesplegado = _muestraCampo.getText();

if (_operacionPrevia.equals("=")) {
_logica.setTotal(testoDesplegado);
} else if (_operacionPrevia.equals("+")) {
_logica.add(testoDesplegado);
} else if (_operacionPrevia.equals("-")) {
_logica.subtract(testoDesplegado);
} else if (_operacionPrevia.equals("*")) {
_logica.multiply(testoDesplegado);
} else if (_operacionPrevia.equals("/")) {
_logica.divide(testoDesplegado);
}

_muestraCampo.setText("" + _logica.getTotalString());

} catch (NumberFormatException ex) {
actionClear();
_muestraCampo.setText("Error");
}

//... coloca _operacionPrevia para el siguiente operador.
_operacionPrevia = e.getActionCommand();
}//termina endif
}//termina metodo
}//termina clase

//===================================== Clase listener interna ClearListener

class NumListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String digit = e.getActionCommand(); // Obtenemos el texto a partir del boton presionado
if (_iniciaNumero) {
//... Es el primer digito, se limpia el primer campo y se coloca el digito presionado
_muestraCampo.setText(digit);
//... ya no es el primer dígito
_iniciaNumero = false;
} else {
//... agrega este dígito al final del camplo del display
_muestraCampo.setText(_muestraCampo.getText() + digit);
}
}
}

//==================================== Listener interno, clase ClearListener
class ClearListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
actionClear();
}
}
}

Clase CalcLogic


package javaapplication1;

public class CalcLogic {
//-- variables
private int _currentTotal;

/** Constructor */
public CalcLogic(){
_currentTotal = 0;

}

public void setTotal(String n){
_currentTotal = convertToNumber(n);
}

private int convertToNumber(String n){
return Integer.parseInt(n);
}
public int add(String n){
return _currentTotal+=convertToNumber(n);
}
public void subtract(String n) {
_currentTotal -= convertToNumber(n);
}

public void multiply(String n) {
_currentTotal *= convertToNumber(n);
}

public void divide(String n) {
_currentTotal /= convertToNumber(n);
}
public String getTotalString() {
return "" + _currentTotal;
}

}

Advertisement
  1. Dejar un comentario

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.