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
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();
00037
00038 contentPane.setLayout(new BorderLayout());
00039
00040
00041
00042 JPanel textField = new JPanel(new FlowLayout(FlowLayout.RIGHT));
00043
00044
00045
00046 tf.setHorizontalAlignment(JTextField.RIGHT);
00047 tf.setEditable(false);
00048 textField.add(tf);
00049 contentPane.add(textField, BorderLayout.NORTH);
00050 OperationListener ol = new OperationListener();
00051
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
00074
00075
00076 JPanel buttonField = new JPanel(new GridLayout(4, 5, 3, 3));
00077
00078
00079 for (int i = 7; i <= 9; i++) {
00080
00081 JButton temp = new JButton(i + "");
00082 ;
00083 temp.addActionListener(nl);
00084 buttonField.add(temp);
00085 }
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 }
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 }
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);
00110
00111
00112
00113
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
00120 addWindowListener(new WindowCloser());
00121 }
00122
00123 class WindowCloser extends WindowAdapter {
00124 public void windowClosing(WindowEvent evt) {
00125 System.exit(0);
00126 }
00127 }
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 }
00140 else if (waiting) {
00141 String output = userInput;
00142 tf.setText(output);
00143 waiting = false;
00144 }
00145 else if (currentDisplay.equals("0"))
00146 tf.setText(userInput);
00147 else
00148 tf.setText(currentDisplay + userInput);
00149 }
00150 else {
00151 if (equalsHit) {
00152 equalsHit = false;
00153 waiting = false;
00154 tf.setText("0.");
00155 }
00156 else if (waiting) {
00157 waiting = false;
00158 tf.setText("0.");
00159 }
00160 else if (currentDisplay.equals("0"))
00161 tf.setText(currentDisplay + ".");
00162 else if (currentDisplay.indexOf(".") < 0)
00163 tf.setText(currentDisplay + ".");
00164 }
00165 }
00166 }
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 }
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 }
00183 }
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
00242
00243
00244
00245
00246
00247 double numericAnswer = AlgorithmicsSingleton.getInstance()
00248 .subtract(num1, num2);
00249
00250
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
00281
00282
00283
00284
00285
00286 double numericAnswer = AlgorithmicsSingleton.getInstance()
00287 .multiply(num1, num2);
00288
00289
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
00319
00320
00321
00322
00323
00324 double numericAnswer = AlgorithmicsSingleton.getInstance()
00325 .divide(num1, num2);
00326
00327
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
00357
00358
00359
00360
00361
00362 double numericAnswer = AlgorithmicsSingleton.getInstance().add(
00363 num1, num2);
00364
00365
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
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
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
00434
00435
00436
00437
00438
00439 number=AlgorithmicsSingleton.getInstance().square(number);
00440
00441
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
00472
00473
00474
00475
00476
00477 double numericAnswer = AlgorithmicsSingleton.getInstance().exp(num1, num2);
00478
00479
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
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
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
00538
00539
00540
00541
00542
00543 double numericAnswer = AlgorithmicsSingleton.getInstance().modulo(num1, num2);
00544
00545
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