A Calculator
Home ] Up ] First Attempt ] Second Attempt ] [ A Calculator ]

 

 

Here's an example of a simple calculator, laid out using nested panels with Borderlayout and GridLayout managers:

package swingExamples;

import java.awt.BorderLayout;
import java.awt.Container;
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;
import javax.swing.JTextField;

class CalculatorPanel extends JPanel
{
  public CalculatorPanel()
  {
    setLayout(new BorderLayout());
    m_display.setEditable(false);
    add(m_display, BorderLayout.NORTH);
    add(m_buttonsPanel, BorderLayout.CENTER);
    add(m_clearButton, BorderLayout.SOUTH);
    m_clearButton.addActionListener( new ActionListener()
      {
        public void actionPerformed(ActionEvent evt)
        {
          m_buttonsPanel.clear();
        }
      }
    );
  }

  ////// Private data //////
  private JTextField m_display = new JTextField("0");
  private ButtonsPanel m_buttonsPanel = new ButtonsPanel();
  private JButton m_clearButton = new JButton("Clear");

  ////// Inner classes /////
  class ButtonsPanel extends JPanel 
      implements ActionListener
  {
    public ButtonsPanel()
    {
      setLayout(new GridLayout(4, 4));
      String buttonLabels = "789/456*123-0.=+";
      for (int i = 0; i < buttonLabels.length(); i++)
      {
        addButton(buttonLabels.substring(i, i + 1));
      }
    }

    public void clear()
    {
      m_arg = 0.0;
      m_op = '=';
      m_start = true;
      m_display.setText("");
    }

    private void addButton(String label)
    {
      JButton button = new JButton(label);
      add(button);
      button.addActionListener(this);
    }

    // ActionListener required methods
    public void actionPerformed(ActionEvent evt)
    {
      String command = evt.getActionCommand();
      char commandChar = command.charAt(0);
      if ('0' <= commandChar && 
          commandChar <= '9' || commandChar == '.')
      {
        if (m_start)
        {
          m_display.setText(command);
        }
        else
        {
          m_display.setText(m_display.getText() + 
                                commandChar);
        }
        m_start = false;
      }
      else
      {
        if (m_start)
        {
          if (commandChar == '-' || commandChar == '+')
          {
            m_display.setText(command);
            m_start = false;
          }
          else
          {
            m_op = commandChar;
          }
        }
        else
        {
          double x = Double.parseDouble(
                              m_display.getText());
          calculate(x);
          m_op = commandChar;
          m_start = true;
        }
      }
    }

    private void calculate(double n)
    {
      switch (m_op)
      {
        case '+':
          m_arg += n;
          break;
        case '-':
          m_arg -= n;
          break;
        case '*':
          m_arg *= n;
          break;
        case '/':
          m_arg /= n;
          break;
        case '=':
          m_arg = n;
      }
      m_display.setText("" + m_arg);
    }

    ////////////// Private Data //////////////////
    private boolean m_start = true;
    private double m_arg = 0.0;
    private char m_op = '=';
  }
}

class CalculatorFrame extends JFrame
{
  public CalculatorFrame()
  {
    setTitle("Calculator");
    setSize(200, 200);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    Container contentPane = getContentPane();
    contentPane.add( new CalculatorPanel() );
  }
}

public class Calculator
{
  public static void main(String[] args)
  {
    CalculatorFrame frame = new CalculatorFrame();
    frame.setVisible(true);
  }
}

which produces:

 

This page was last modified on 02 October, 2007