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

JCalc.java

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

Generated on Sat Sep 3 23:03:25 2005 for JCalculator 0.1b by  doxygen 1.4.4