CyberCodes
Java Swing Calculator Welcome

Reminders sa mga rehistradong myembro:

•ang lengwahe na gagamitin ay pawang english at tagalog lamang

•Bawal po dito ang pakikipag away

•Bawal ang mga shorcut na mga words
Example: txt, Pwd, at iba pa

•Bawal mababastos at masasakit na salita o anu mang makakasakit
ng damdamin ng isang myembro ng forum na ito

•use the "like" button if the post of the following user you think are usefull



Join the forum, it's quick and easy

CyberCodes
Java Swing Calculator Welcome

Reminders sa mga rehistradong myembro:

•ang lengwahe na gagamitin ay pawang english at tagalog lamang

•Bawal po dito ang pakikipag away

•Bawal ang mga shorcut na mga words
Example: txt, Pwd, at iba pa

•Bawal mababastos at masasakit na salita o anu mang makakasakit
ng damdamin ng isang myembro ng forum na ito

•use the "like" button if the post of the following user you think are usefull

CyberCodes
Would you like to react to this message? Create an account in a few clicks or log in to continue.

Java Swing Calculator

Go down

Java Swing Calculator Empty Java Swing Calculator

Post by princeterror Sat Sep 22, 2012 4:45 am

[You must be registered and logged in to see this image.]

Code:
Topic: A basic Java Swing Calculator

Conventions Used in Source code
---------------------------------
   1. All JLabel components start with jlb*
   2. All JPanel components start with jpl*
   3. All JMenu components start with jmenu*
   4. All JMenuItem components start with jmenuItem*
   5. All JDialog components start with jdlg*
   6. All JButton components start with jbn*
*/

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;

public class Calculator extends JFrame implements ActionListener{
   // Variables
   final int MAX_INPUT_LENGTH = 20;
   final int INPUT_MODE = 0;
   final int RESULT_MODE = 1;
   final int ERROR_MODE = 2;
   int displayMode;

   boolean clearOnNextDigit, percent;
   double lastNumber;
   String lastOperator;

   private JMenu jmenuFile, jmenuHelp;
   private JMenuItem jmenuitemExit, jmenuitemAbout;
   
   private JLabel jlbOutput;
   private JButton jbnButtons[];
   private JPanel jplMaster, jplBackSpace, jplControl;
   
   /*
    * Font(String name, int style, int size)
      Creates a new Font from the specified name, style and point size.
    */
   
   Font f12 = new Font("Times New Roman", 0, 12);
   Font f121 = new Font("Times New Roman", 1, 12);
   
   // Constructor
   public Calculator()
   {
      /* Set Up the JMenuBar.
       * Have Provided All JMenu's with Mnemonics
       * Have Provided some JMenuItem components with Keyboard Accelerators
       */
      
      jmenuFile = new JMenu("File");
      jmenuFile.setFont(f121);
      jmenuFile.setMnemonic(KeyEvent.VK_F);
      
      jmenuitemExit = new JMenuItem("Exit");
      jmenuitemExit.setFont(f12);
      jmenuitemExit.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_X,
                        ActionEvent.CTRL_MASK));
      jmenuFile.add(jmenuitemExit);

      jmenuHelp = new JMenu("Help");
      jmenuHelp.setFont(f121);
      jmenuHelp.setMnemonic(KeyEvent.VK_H);

      jmenuitemAbout = new JMenuItem("About Calculator");
      jmenuitemAbout.setFont(f12);
      jmenuHelp.add(jmenuitemAbout);
      
      JMenuBar mb = new JMenuBar();
      mb.add(jmenuFile);
      mb.add(jmenuHelp);
      setJMenuBar(mb);
      
      //Set frame layout manager

      setBackground(Color.gray);

      jplMaster = new JPanel();

      jlbOutput = new JLabel("0");
      jlbOutput.setHorizontalTextPosition(JLabel.RIGHT);
      jlbOutput.setBackground(Color.WHITE);
      jlbOutput.setOpaque(true);
      
      // Add components to frame
      getContentPane().add(jlbOutput, BorderLayout.NORTH);

      jbnButtons = new JButton[23];
//      GridLayout(int rows, int cols, int hgap, int vgap)

      JPanel jplButtons = new JPanel();      // container for Jbuttons

      // Create numeric Jbuttons
      for (int i=0; i<=9; i++)
      {
         // set each Jbutton label to the value of index
         jbnButtons[i] = new JButton(String.valueOf(i));
      }

      // Create operator Jbuttons
      jbnButtons[10] = new JButton("+/-");
      jbnButtons[11] = new JButton(".");
      jbnButtons[12] = new JButton("=");
      jbnButtons[13] = new JButton("/");
      jbnButtons[14] = new JButton("*");
      jbnButtons[15] = new JButton("-");
      jbnButtons[16] = new JButton("+");
      jbnButtons[17] = new JButton("sqrt");
      jbnButtons[18] = new JButton("1/x");
      jbnButtons[19] = new JButton("%");
      
      jplBackSpace = new JPanel();
      jplBackSpace.setLayout(new GridLayout(1, 1, 2, 2));

      jbnButtons[20] = new JButton("Backspace");
      jplBackSpace.add(jbnButtons[20]);

      jplControl = new JPanel();
      jplControl.setLayout(new GridLayout(1, 2, 2 ,2));

      jbnButtons[21] = new JButton(" CE ");
      jbnButtons[22] = new JButton("C");

      jplControl.add(jbnButtons[21]);
      jplControl.add(jbnButtons[22]);

//      Setting all Numbered JButton's to Blue. The rest to Red
      for (int i=0; i<jbnButtons.length; i++)   {
         jbnButtons[i].setFont(f12);

         if (i<10)
            jbnButtons[i].setForeground(Color.blue);
            
         else
            jbnButtons[i].setForeground(Color.red);
      }
   
      // Set panel layout manager for a 4 by 5 grid
      jplButtons.setLayout(new GridLayout(4, 5, 2, 2));
      
      //Add buttons to keypad panel starting at top left
      // First row
      for(int i=7; i<=9; i++)      {
         jplButtons.add(jbnButtons[i]);
      }
      
      // add button / and sqrt
      jplButtons.add(jbnButtons[13]);
      jplButtons.add(jbnButtons[17]);
      
      // Second row
      for(int i=4; i<=6; i++)
      {
         jplButtons.add(jbnButtons[i]);
      }
      
      // add button * and x^2
      jplButtons.add(jbnButtons[14]);
      jplButtons.add(jbnButtons[18]);

      // Third row
      for( int i=1; i<=3; i++)
      {
         jplButtons.add(jbnButtons[i]);
      }
      
      //adds button - and %
      jplButtons.add(jbnButtons[15]);
      jplButtons.add(jbnButtons[19]);
      
      //Fourth Row
      // add 0, +/-, ., +, and =
      jplButtons.add(jbnButtons[0]);
      jplButtons.add(jbnButtons[10]);
      jplButtons.add(jbnButtons[11]);
      jplButtons.add(jbnButtons[16]);
      jplButtons.add(jbnButtons[12]);
      
      jplMaster.setLayout(new BorderLayout());
      jplMaster.add(jplBackSpace, BorderLayout.WEST);
      jplMaster.add(jplControl, BorderLayout.EAST);
      jplMaster.add(jplButtons, BorderLayout.SOUTH);

      // Add components to frame
      getContentPane().add(jplMaster, BorderLayout.SOUTH);
      requestFocus();
      
      //activate ActionListener
      for (int i=0; i<jbnButtons.length; i++){
         jbnButtons[i].addActionListener(this);
      }
      
      jmenuitemAbout.addActionListener(this);
      jmenuitemExit.addActionListener(this);

      clearAll();

      //add WindowListener for closing frame and ending program
      addWindowListener(new WindowAdapter() {

            public void windowClosed(WindowEvent e)
            {
               System.exit(0);
            }
         }
      );
   }   //End of Contructor Calculator

   // Perform action
   public void actionPerformed(ActionEvent e){
      double result = 0;
    
      if(e.getSource() == jmenuitemAbout){
        JDialog dlgAbout = new CustomABOUTDialog(this,
                        "About Java Swing Calculator", true);
         dlgAbout.setVisible(true);
      }else if(e.getSource() == jmenuitemExit){
         System.exit(0);
      }   

      // Search for the button pressed until end of array or key found
      for (int i=0; i<jbnButtons.length; i++)
      {
         if(e.getSource() == jbnButtons[i])
         {
            switch(i)
            {
               case 0:
                  addDigitToDisplay(i);
                  break;

               case 1:
                  addDigitToDisplay(i);
                  break;

               case 2:
                  addDigitToDisplay(i);
                  break;

               case 3:
                  addDigitToDisplay(i);
                  break;

               case 4:
                  addDigitToDisplay(i);
                  break;

               case 5:
                  addDigitToDisplay(i);
                  break;

               case 6:
                  addDigitToDisplay(i);
                  break;

               case 7:
                  addDigitToDisplay(i);
                  break;

               case 8:
                  addDigitToDisplay(i);
                  break;

               case 9:
                  addDigitToDisplay(i);
                  break;

               case 10:   // +/-
                  processSignChange();
                  break;

               case 11:   // decimal point
                  addDecimalPoint();
                  break;

               case 12:   // =
                  processEquals();
                  break;

               case 13:   // divide
                  processOperator("/");
                  break;

               case 14:   // *
                  processOperator("*");
                  break;

               case 15:   // -
                  processOperator("-");
                  break;

               case 16:   // +
                  processOperator("+");
                  break;

               case 17:   // sqrt
                  if (displayMode != ERROR_MODE)
                  {
                    try
                     {
                        if (getDisplayString().indexOf("-") == 0)
                            displayError("Invalid input for function!");

                        result = Math.sqrt(getNumberInDisplay());
                        displayResult(result);
                     }

                     catch(Exception ex)
                     {
                        displayError("Invalid input for function!");
                        displayMode = ERROR_MODE;
                     }
                  }
                  break;

               case 18:   // 1/x
                  if (displayMode != ERROR_MODE){
                     try
                     {
                        if (getNumberInDisplay() == 0)
                           displayError("Cannot divide by zero!");
   
                        result = 1 / getNumberInDisplay();
                        displayResult(result);
                     }
                     
                     catch(Exception ex)   {
                        displayError("Cannot divide by zero!");
                        displayMode = ERROR_MODE;
                     }
                  }
                  break;

               case 19:   // %
                  if (displayMode != ERROR_MODE){
                     try   {
                        result = getNumberInDisplay() / 100;
                        displayResult(result);
                     }
   
                     catch(Exception ex)   {
                        displayError("Invalid input for function!");
                        displayMode = ERROR_MODE;
                     }
                  }
                  break;

               case 20:   // backspace
                  if (displayMode != ERROR_MODE){
                     setDisplayString(getDisplayString().substring(0,
                             getDisplayString().length() - 1));
                     
                     if (getDisplayString().length() < 1)
                        setDisplayString("0");
                  }
                  break;

               case 21:   // CE
                  clearExisting();
                  break;

               case 22:   // C
                  clearAll();
                  break;
            }
         }
      }
   }

   void setDisplayString(String s){
      jlbOutput.setText(s);
   }

   String getDisplayString (){
      return jlbOutput.getText();
   }

   void addDigitToDisplay(int digit){
      if (clearOnNextDigit)
         setDisplayString("");

      String inputString = getDisplayString();
      
      if (inputString.indexOf("0") == 0){
         inputString = inputString.substring(1);
      }

      if ((!inputString.equals("0") || digit > 0) 
                     && inputString.length() < MAX_INPUT_LENGTH){
         setDisplayString(inputString + digit);
      }
      

      displayMode = INPUT_MODE;
      clearOnNextDigit = false;
   }

   void addDecimalPoint(){
      displayMode = INPUT_MODE;

      if (clearOnNextDigit)
         setDisplayString("");

      String inputString = getDisplayString();
   
      // If the input string already contains a decimal point, don't
      //  do anything to it.
      if (inputString.indexOf(".") < 0)
         setDisplayString(new String(inputString + "."));
   }

   void processSignChange(){
      if (displayMode == INPUT_MODE)
      {
         String input = getDisplayString();

         if (input.length() > 0 && !input.equals("0"))
         {
            if (input.indexOf("-") == 0)
               setDisplayString(input.substring(1));

            else
               setDisplayString("-" + input);
         }
         
      }

      else if (displayMode == RESULT_MODE)
      {
         double numberInDisplay = getNumberInDisplay();
      
         if (numberInDisplay != 0)
            displayResult(-numberInDisplay);
      }
   }

   void clearAll()   {
      setDisplayString("0");
      lastOperator = "0";
      lastNumber = 0;
      displayMode = INPUT_MODE;
      clearOnNextDigit = true;
   }

   void clearExisting(){
      setDisplayString("0");
      clearOnNextDigit = true;
      displayMode = INPUT_MODE;
   }

   double getNumberInDisplay()   {
      String input = jlbOutput.getText();
      return Double.parseDouble(input);
   }

   void processOperator(String op) {
      if (displayMode != ERROR_MODE)
      {
         double numberInDisplay = getNumberInDisplay();

         if (!lastOperator.equals("0"))   
         {
            try
            {
               double result = processLastOperator();
               displayResult(result);
               lastNumber = result;
            }

            catch (DivideByZeroException e)
            {
            }
         }
      
         else
         {
            lastNumber = numberInDisplay;
         }
         
         clearOnNextDigit = true;
         lastOperator = op;
      }
   }

   void processEquals(){
      double result = 0;

      if (displayMode != ERROR_MODE){
         try         
         {
            result = processLastOperator();
            displayResult(result);
         }
         
         catch (DivideByZeroException e)   {
            displayError("Cannot divide by zero!");
         }

         lastOperator = "0";
      }
   }

   double processLastOperator() throws DivideByZeroException {
      double result = 0;
      double numberInDisplay = getNumberInDisplay();

      if (lastOperator.equals("/"))
      {
         if (numberInDisplay == 0)
            throw (new DivideByZeroException());

         result = lastNumber / numberInDisplay;
      }
         
      if (lastOperator.equals("*"))
         result = lastNumber * numberInDisplay;

      if (lastOperator.equals("-"))
         result = lastNumber - numberInDisplay;

      if (lastOperator.equals("+"))
         result = lastNumber + numberInDisplay;

      return result;
   }

   void displayResult(double result){
      setDisplayString(Double.toString(result));
      lastNumber = result;
      displayMode = RESULT_MODE;
      clearOnNextDigit = true;
   }

   void displayError(String errorMessage){
      setDisplayString(errorMessage);
      lastNumber = 0;
      displayMode = ERROR_MODE;
      clearOnNextDigit = true;
   }

   public static void main(String args[]) {
      Calculator calci = new Calculator();
      Container contentPane = calci.getContentPane();
//      contentPane.setLayout(new BorderLayout());
      calci.setTitle("Java Swing Calculator");
      calci.setSize(241, 217);
      calci.pack();
      calci.setLocation(400, 250);
      calci.setVisible(true);
      calci.setResizable(false);
   }
   
}      //End of Swing Calculator Class.

class DivideByZeroException extends Exception{
   public DivideByZeroException()
   {
      super();
   }
   
   public DivideByZeroException(String s)
   {
      super(s);
   }
}

class CustomABOUTDialog extends JDialog implements ActionListener {
   JButton jbnOk;

   CustomABOUTDialog(JFrame parent, String title, boolean modal){
      super(parent, title, modal);
      setBackground(Color.black);
      
      JPanel p1 = new JPanel(new FlowLayout(FlowLayout.CENTER));

      StringBuffer text = new StringBuffer();
      text.append("Calculator Information\n\n");
      text.append("Developer:   Hemanth\n");
      text.append("Version:   1.0");
      
      JTextArea jtAreaAbout = new JTextArea(5, 21);
      jtAreaAbout.setText(text.toString());
      jtAreaAbout.setFont(new Font("Times New Roman", 1, 13));
      jtAreaAbout.setEditable(false);

      p1.add(jtAreaAbout);
      p1.setBackground(Color.red);
      getContentPane().add(p1, BorderLayout.CENTER);

      JPanel p2 = new JPanel(new FlowLayout(FlowLayout.CENTER));
      jbnOk = new JButton(" OK ");
      jbnOk.addActionListener(this);

      p2.add(jbnOk);
      getContentPane().add(p2, BorderLayout.SOUTH);

      setLocation(408, 270);
      setResizable(false);

      addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e)
            {
               Window aboutDialog = e.getWindow();
               aboutDialog.dispose();
            }
         }
      );

      pack();
   }

   public void actionPerformed(ActionEvent e)
   {
      if(e.getSource() == jbnOk)   {
         this.dispose();
      }
   }
   
princeterror
princeterror
Universal Moderator
Universal Moderator

Posts : 272
Credits : 11465
Fame : 81
Join date : 2012-06-07
Age : 33

Back to top Go down

Back to top

- Similar topics

 
Permissions in this forum:
You cannot reply to topics in this forum