Main Page | Packages | Class Hierarchy | Class List | Directories | File List | Class Members

JCalc.java

Go to the documentation of this file.
00001 import javax.swing.*;
00002 import java.awt.*;
00003 import java.awt.event.*;
00004 
00005 
00006 public class JCalc{
00007 
00008         public static void main(String[] args){
00009           JFrame f = new CalculatorFrame("JCalculator");
00010           f.setSize(375,275);
00011           f.setVisible(true);   
00012         }
00013 }
00014         //Frame Class
00015         class CalculatorFrame extends JFrame{
00016 
00017           private JTextField tf = new JTextField("0",28);
00018           private String previousNumber = "0";
00019           private String currentNumber = "0";
00020           private char lastOperator = 0;
00021           private boolean equalsHit = false;
00022           private boolean waiting = false;
00023       
00024           public CalculatorFrame(String title){
00025             super(title);
00026             Container contentPane = getContentPane();//get the context in which objects will be placed
00027             contentPane.setLayout(new BorderLayout());//sets LayoutManger of context
00028 
00029             //Top Panel
00030             JPanel textField = new JPanel(new FlowLayout(FlowLayout.RIGHT));//Begin textField (top) Panel
00031             tf.setHorizontalAlignment(JTextField.RIGHT);
00032             tf.setEditable(false);
00033             textField.add(tf);//end textField Panel
00034             contentPane.add(textField, BorderLayout.NORTH);//add top Panel
00035             OperationListener ol = new OperationListener();
00036             //Buttons
00037             JButton divide = new JButton("/");
00038             divide.addActionListener(ol);
00039             JButton square = new JButton("x^2");
00040             square.addActionListener(ol);
00041             JButton multiply = new JButton("*");
00042             multiply.addActionListener(ol);
00043             JButton exponentiate = new JButton("X^Y");
00044             exponentiate.addActionListener(ol);
00045             JButton subtract = new JButton("-");
00046             subtract.addActionListener(ol);
00047             JButton mod = new JButton("%");
00048             mod.addActionListener(ol);
00049             NumberListener nl = new NumberListener();
00050             JButton decimal = new JButton(".");
00051             decimal.addActionListener(nl);
00052             JButton equals = new JButton("=");
00053             equals.addActionListener(ol);
00054             JButton add = new JButton("+");
00055             add.addActionListener(ol);
00056             JButton factorial = new JButton("!");
00057             factorial.addActionListener(ol);
00058             //End generation of Buttons
00059             
00060             //Center Panel
00061             JPanel buttonField = new JPanel(new GridLayout(4,5,3,3));//Creates buttonField Panel 
00062             for(int i = 7; i <= 9; i++){//Begin placement of Buttons in CENTER Panel
00063               JButton temp = new JButton(i + "");;
00064               temp.addActionListener(nl);
00065               buttonField.add(temp);
00066             }//end for
00067             buttonField.add(divide);
00068             buttonField.add(square);
00069             for(int i = 4; i <= 6; i++){
00070               JButton temp = new JButton(i + "");
00071               temp.addActionListener(nl);
00072               buttonField.add(temp);
00073             }//end for
00074             buttonField.add(multiply);
00075             buttonField.add(exponentiate);
00076             for(int i = 1; i <= 3; i++){
00077               JButton temp = new JButton(i + "");
00078               temp.addActionListener(nl);
00079               buttonField.add(temp);
00080             }//end for
00081             buttonField.add(subtract);
00082             buttonField.add(mod);
00083             JButton zero = new JButton("0");
00084             zero.addActionListener(nl);
00085             buttonField.add(zero);
00086             buttonField.add(decimal);
00087             buttonField.add(equals);
00088             buttonField.add(add);
00089             buttonField.add(factorial);
00090             contentPane.add(buttonField,BorderLayout.CENTER);//End Placement of Buttons in CENTER Panel
00091              
00092             //Start Bottom Panel
00093             JPanel control = new JPanel(new GridLayout(1,2,3,3));
00094             JButton clear = new JButton("Clear");
00095             clear.addActionListener(new FunctionListener());
00096             control.add(clear);
00097             contentPane.add(control, BorderLayout.SOUTH);
00098             //End Bottom Panel
00099             addWindowListener(new WindowCloser());//activates close button
00100         }//end CalculatorFrame
00101 
00102         class WindowCloser extends WindowAdapter{ //Closes Window
00103           public void windowClosing(WindowEvent evt){
00104             System.exit(0);
00105           }//end windowClosing
00106         }//end WindowCloser
00107     
00108 
00109         class NumberListener implements ActionListener{
00110           public void actionPerformed(ActionEvent evt){
00111               String userInput = evt.getActionCommand();
00112               String currentDisplay = tf.getText();
00113               if(!userInput.equals(".")){
00114                 if(equalsHit){
00115                   String output = userInput;
00116                   equalsHit = false;
00117                   waiting = false;
00118                   tf.setText(output);
00119                 }//end if
00120                 else if(waiting){
00121                   String output = userInput;
00122                   tf.setText(output);
00123                   waiting = false;
00124                 }//end if
00125                 else if(currentDisplay.equals("0"))
00126                   tf.setText(userInput);
00127                 else
00128                   tf.setText(currentDisplay + userInput);
00129               }//end if
00130               else{
00131                 if(equalsHit){
00132                   equalsHit = false;
00133                   waiting = false;
00134                   tf.setText("0.");
00135                 }//end if
00136                 else if(waiting){
00137                   waiting = false;
00138                   tf.setText("0.");
00139                 }//end if
00140                 else if(currentDisplay.equals("0"))
00141                   tf.setText(currentDisplay + ".");
00142                 else if(currentDisplay.indexOf(".") < 0)
00143                   tf.setText(currentDisplay + ".");
00144               }//end else
00145           }//end actionPerformed
00146         }//end NumberListener
00147 
00148         class FunctionListener implements ActionListener{
00149           public void actionPerformed(ActionEvent evt){
00150             String userInput = evt.getActionCommand();
00151             if(userInput.equals("Clear"))
00152               clear();
00153           }//end actionPerformed
00154 
00155           public void clear(){
00156               previousNumber = "0";
00157               currentNumber = "0";
00158               lastOperator = 0;
00159               equalsHit = false;
00160               waiting = false;
00161               tf.setText("0");
00162             }//end clear
00163           }//end FunctionListener
00164 
00165 
00166         class OperationListener implements ActionListener{
00167           public void actionPerformed(ActionEvent evt){
00168             String userInput = evt.getActionCommand();
00169             char character = userInput.charAt(0);
00170             switch(character){
00171               case '-': subtract();
00172                         break;
00173               case '*': multiply();
00174                         break;
00175               case '/': divide();
00176                         break;
00177               case '+': add();
00178                         break;
00179               case '=': equalsSign();
00180                         break;
00181               case 'x': square();
00182                         break;
00183               case 'X': exponentiate();
00184                         break;
00185               case '!': factorial();
00186                         break;
00187               case '%': mod();
00188                         break;
00189             }
00190           }
00191 
00192           public void subtract(){
00193             if(!waiting){
00194               equalsHit = false;
00195               waiting = true;
00196               previousNumber = tf.getText();
00197               lastOperator = '-';
00198             }
00199             else if(lastOperator == '-'){
00200               String currentNumber = tf.getText();
00201               double num1 = 0; double num2 = 0;
00202               try{
00203                 num1 = Double.parseDouble(previousNumber);
00204                 num2 = Double.parseDouble(currentNumber);
00205               }
00206               catch(NumberFormatException e){
00207                 tf.setText("Error!!! Invalid Number");
00208                 previousNumber = "0";
00209                 lastOperator = 0;
00210                 equalsHit = true;
00211               }
00212               double numericAnswer = num1 - num2;
00213               previousNumber = numericAnswer + "";
00214               previousNumber = format(previousNumber);
00215               tf.setText(previousNumber);
00216             }
00217           }
00218 
00219           public void multiply(){
00220             if(!waiting){
00221               equalsHit = false;
00222               waiting = true;
00223               previousNumber = tf.getText();
00224               lastOperator = '*';
00225             }
00226             else if(lastOperator == '*'){
00227               String currentNumber = tf.getText();
00228               double num1 = 0; double num2 = 0;
00229               try{
00230                 num1 = Double.parseDouble(previousNumber);
00231                 num2 = Double.parseDouble(currentNumber);
00232               }
00233               catch(NumberFormatException e){
00234                 tf.setText("Error!!! Invalid Number");
00235                 previousNumber = "0";
00236                 lastOperator = 0;
00237                 equalsHit = true;
00238               }
00239               double numericAnswer = num1 * num2;
00240               previousNumber = numericAnswer + "";
00241               previousNumber = format(previousNumber);
00242               tf.setText(previousNumber);
00243             }
00244           }
00245 
00246           public void divide(){
00247             if(!waiting){
00248               equalsHit = false;
00249               waiting = true;
00250               previousNumber = tf.getText();
00251               lastOperator = '/';
00252             }
00253             else if(lastOperator == '/'){
00254               String currentNumber = tf.getText();
00255               double num1 = 0; double num2 = 0;
00256               try{
00257                 num1 = Double.parseDouble(previousNumber);
00258                 num2 = Double.parseDouble(currentNumber);
00259               }
00260               catch(NumberFormatException e){
00261                 tf.setText("Error!!! Invalid Number");
00262                 previousNumber = "0";
00263                 lastOperator = 0;
00264                 equalsHit = true;
00265               }
00266               double numericAnswer = num1 / num2;
00267               previousNumber = numericAnswer + "";
00268               previousNumber = format(previousNumber);
00269               tf.setText(previousNumber);
00270             }
00271           }
00272 
00273           public void add(){
00274             if(!waiting){
00275               equalsHit = false;
00276               waiting = true;
00277               previousNumber = tf.getText();
00278               lastOperator = '+';
00279             }
00280             else if(lastOperator == '+'){
00281               String currentNumber = tf.getText();
00282               double num1 = 0; double num2 = 0;
00283               try{
00284                 num1 = Double.parseDouble(previousNumber);
00285                 num2 = Double.parseDouble(currentNumber);
00286               }
00287               catch(NumberFormatException e){
00288                 tf.setText("Error!!! Invalid Number");
00289                 previousNumber = "0";
00290                 lastOperator = 0;
00291                 equalsHit = true;
00292               }
00293               double numericAnswer = num1 + num2;
00294               previousNumber = numericAnswer + "";
00295               previousNumber = format(previousNumber);
00296               tf.setText(previousNumber);
00297             }
00298           }
00299 
00300           public void equalsSign(){
00301           if(!equalsHit){
00302             currentNumber = tf.getText();
00303           }
00304             equalsHit = true;
00305             double num1 = 0; double num2 = 0;
00306             try{
00307               num1 = Double.parseDouble(previousNumber);
00308               num2 = Double.parseDouble(currentNumber);
00309             }
00310             catch(NumberFormatException e){
00311               tf.setText("Error!!! Invalid Number");
00312               previousNumber = "0";
00313               lastOperator = 0;
00314               equalsHit = true;
00315             }
00316             switch(lastOperator){
00317               case '*':  previousNumber = (num1 * num2) + "";
00318                          break;
00319               case '+':  previousNumber = (num1 + num2) + "";
00320                          break;
00321               case '-':  previousNumber = (num1 - num2) + "";
00322                          break;
00323               case '/':  previousNumber = (num1 / num2) + "";
00324                          break;
00325               case 'X':  previousNumber = Math.pow(num1,num2) + "";
00326                          break;
00327               case '%':  previousNumber = (num1 % num2) + "";
00328                          break;
00329             }
00330             previousNumber = format(previousNumber);
00331             tf.setText(previousNumber);
00332           }
00333 
00334           public void square(){
00335             previousNumber = tf.getText();
00336             double number = 0;
00337             try{
00338               number = Double.parseDouble(previousNumber);
00339             }
00340             catch(NumberFormatException e){
00341              tf.setText("Error!!! Invalid Number");
00342              previousNumber = "0";
00343              lastOperator = 0;
00344              equalsHit = true;
00345             }
00346             number *= number;
00347             previousNumber = number + "";
00348             previousNumber = format(previousNumber);
00349             tf.setText(previousNumber);
00350             equalsHit = true;
00351             lastOperator = 'x';
00352           }
00353 
00354           public void exponentiate(){
00355             if(!waiting){
00356               equalsHit = false;
00357               waiting = true;
00358               previousNumber = tf.getText();
00359               lastOperator = 'X';
00360             }
00361             else if(lastOperator == 'X'){
00362               String currentNumber = tf.getText();
00363               double num1 = 0; double num2 = 0;
00364               try{
00365                 num1 = Double.parseDouble(previousNumber);
00366                 num2 = Double.parseDouble(currentNumber);
00367               }
00368               catch(NumberFormatException e){
00369                 tf.setText("Error!!! Invalid Number");
00370                 previousNumber = "0";
00371                 lastOperator = 0;
00372                 equalsHit = true;
00373               }
00374               double numericAnswer = Math.pow(num1,num2);
00375               previousNumber = numericAnswer + "";
00376               previousNumber = format(previousNumber);
00377               tf.setText(previousNumber);
00378             }
00379           }
00380 
00381           public void factorial(){
00382             previousNumber = tf.getText();
00383             double number = 0;
00384             try{
00385               number = Double.parseDouble(previousNumber);
00386             }
00387             catch(NumberFormatException e){
00388              tf.setText("Error!!! Invalid Number"); 
00389              previousNumber = "0";
00390              lastOperator = 0;
00391              equalsHit = true;
00392             }
00393             int factorial = (int) number;
00394             if(factorial == 0){
00395               factorial = 1;
00396               previousNumber = factorial + "";
00397               tf.setText(previousNumber);
00398               equalsHit = true;
00399               lastOperator = 'x';
00400             }
00401             else{
00402               for(int i = (int) number - 1; i > 1; i--){
00403                 factorial *= i;
00404               }
00405               previousNumber = factorial + "";
00406               tf.setText(previousNumber);
00407               equalsHit = true;
00408               lastOperator = 'x';
00409             }
00410           }
00411 
00412           public void mod(){
00413             if(!waiting){
00414               equalsHit = false;
00415               waiting = true;
00416               previousNumber = tf.getText();
00417               lastOperator = '%';
00418             }
00419             else if(lastOperator == '%'){
00420             if(!equalsHit){
00421               currentNumber = tf.getText();
00422             }
00423               System.out.println(currentNumber);
00424               double num1 = 0; double num2 = 0;
00425               try{
00426                 num1 = Double.parseDouble(previousNumber);
00427                 num2 = Double.parseDouble(currentNumber);
00428               }
00429               catch(NumberFormatException e){
00430                 tf.setText("Error!!! Invalid Number");
00431                 previousNumber = "0";
00432                 lastOperator = 0;
00433                 equalsHit = true;
00434               }
00435               double numericAnswer = num1 % num2;
00436               previousNumber = numericAnswer + "";
00437               previousNumber = format(previousNumber);
00438               tf.setText(previousNumber);
00439             }
00440           }
00441 
00442           public String format(String answer){
00443             double theAnswer = 0;
00444             try{
00445               theAnswer = Double.parseDouble(answer);
00446             }
00447             catch(NumberFormatException e){
00448                 tf.setText("Error!!! Invalid Number");
00449                 previousNumber = "0";
00450                 lastOperator = 0;
00451                 equalsHit = true;
00452             }
00453             if(theAnswer == (int) theAnswer)
00454               return (int) theAnswer + "";
00455             else
00456               return answer;
00457           }
00458      }
00459 }
00460 

Generated on Sat Sep 3 11:57:49 2005 for JCalculator 0.1b by  doxygen 1.4.4