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
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();
00027 contentPane.setLayout(new BorderLayout());
00028
00029
00030 JPanel textField = new JPanel(new FlowLayout(FlowLayout.RIGHT));
00031 tf.setHorizontalAlignment(JTextField.RIGHT);
00032 tf.setEditable(false);
00033 textField.add(tf);
00034 contentPane.add(textField, BorderLayout.NORTH);
00035 OperationListener ol = new OperationListener();
00036
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
00059
00060
00061 JPanel buttonField = new JPanel(new GridLayout(4,5,3,3));
00062 for(int i = 7; i <= 9; i++){
00063 JButton temp = new JButton(i + "");;
00064 temp.addActionListener(nl);
00065 buttonField.add(temp);
00066 }
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 }
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 }
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);
00091
00092
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
00099 addWindowListener(new WindowCloser());
00100 }
00101
00102 class WindowCloser extends WindowAdapter{
00103 public void windowClosing(WindowEvent evt){
00104 System.exit(0);
00105 }
00106 }
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 }
00120 else if(waiting){
00121 String output = userInput;
00122 tf.setText(output);
00123 waiting = false;
00124 }
00125 else if(currentDisplay.equals("0"))
00126 tf.setText(userInput);
00127 else
00128 tf.setText(currentDisplay + userInput);
00129 }
00130 else{
00131 if(equalsHit){
00132 equalsHit = false;
00133 waiting = false;
00134 tf.setText("0.");
00135 }
00136 else if(waiting){
00137 waiting = false;
00138 tf.setText("0.");
00139 }
00140 else if(currentDisplay.equals("0"))
00141 tf.setText(currentDisplay + ".");
00142 else if(currentDisplay.indexOf(".") < 0)
00143 tf.setText(currentDisplay + ".");
00144 }
00145 }
00146 }
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 }
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 }
00163 }
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