Mega Code Archive

 
Categories / Java / Tiny Application
 

A simple calculator

/*    This program is a part of the companion code for Core Java 8th ed.    (http://horstmann.com/corejava)    This program is free software: you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation, either version 3 of the License, or    (at your option) any later version.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.    You should have received a copy of the GNU General Public License    along with this program.  If not, see <http://www.gnu.org/licenses/>. */ import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; /**  * @version 1.33 2007-06-12  * @author Cay Horstmann  */ public class Calculator {    public static void main(String[] args)    {       EventQueue.invokeLater(new Runnable()          {             public void run()             {                CalculatorFrame frame = new CalculatorFrame();                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                frame.setVisible(true);             }          });    } } /**  * A frame with a calculator panel.  */ class CalculatorFrame extends JFrame {    public CalculatorFrame()    {       setTitle("Calculator");       CalculatorPanel panel = new CalculatorPanel();       add(panel);       pack();    } } /**  * A panel with calculator buttons and a result display.  */ class CalculatorPanel extends JPanel {    public CalculatorPanel()    {       setLayout(new BorderLayout());       result = 0;       lastCommand = "=";       start = true;       // add the display       display = new JButton("0");       display.setEnabled(false);       add(display, BorderLayout.NORTH);       ActionListener insert = new InsertAction();       ActionListener command = new CommandAction();       // add the buttons in a 4 x 4 grid       panel = new JPanel();       panel.setLayout(new GridLayout(4, 4));       addButton("7", insert);       addButton("8", insert);       addButton("9", insert);       addButton("/", command);       addButton("4", insert);       addButton("5", insert);       addButton("6", insert);       addButton("*", command);       addButton("1", insert);       addButton("2", insert);       addButton("3", insert);       addButton("-", command);       addButton("0", insert);       addButton(".", insert);       addButton("=", command);       addButton("+", command);       add(panel, BorderLayout.CENTER);    }    /**     * Adds a button to the center panel.     * @param label the button label     * @param listener the button listener     */    private void addButton(String label, ActionListener listener)    {       JButton button = new JButton(label);       button.addActionListener(listener);       panel.add(button);    }    /**     * This action inserts the button action string to the end of the display text.     */    private class InsertAction implements ActionListener    {       public void actionPerformed(ActionEvent event)       {          String input = event.getActionCommand();          if (start)          {             display.setText("");             start = false;          }          display.setText(display.getText() + input);       }    }    /**     * This action executes the command that the button action string denotes.     */    private class CommandAction implements ActionListener    {       public void actionPerformed(ActionEvent event)       {          String command = event.getActionCommand();          if (start)          {             if (command.equals("-"))             {                display.setText(command);                start = false;             }             else lastCommand = command;          }          else          {             calculate(Double.parseDouble(display.getText()));             lastCommand = command;             start = true;          }       }    }    /**     * Carries out the pending calculation.     * @param x the value to be accumulated with the prior result.     */    public void calculate(double x)    {       if (lastCommand.equals("+")) result += x;       else if (lastCommand.equals("-")) result -= x;       else if (lastCommand.equals("*")) result *= x;       else if (lastCommand.equals("/")) result /= x;       else if (lastCommand.equals("=")) result = x;       display.setText("" + result);    }    private JButton display;    private JPanel panel;    private double result;    private String lastCommand;    private boolean start; }