473,465 Members | 2,103 Online
Bytes | Software Development & Data Engineering Community
Create Post

Home Posts Topics Members FAQ

Java Swing Calculator with Precedence

1 New Member
This is a very primative code of a java swing calculator. I have assigned all the number buttons and the operator buttons and I can add, subtract, multiply, and divide two numbers together. However, my teacher wants the operators to follow the algebraic order of operations by chaining multiple operations. Such as, 7 + 4 * 2= 15. The operatorListener is the ActionListener for the operator buttons. Thanks for any help you can give me.



Expand|Select|Wrap|Line Numbers
  1. import java.awt.*;
  2. import javax.swing.*;
  3. import java.lang.*;
  4. import java.awt.event.*;
  5. import java.util.*;
  6.  
  7. import javax.swing.event.*;
  8.  
  9. public class Calculator extends JFrame {
  10.  
  11.     JTextField textField;
  12.     private boolean startNumber= true;
  13.     private int resultTotal;
  14.     private String operator= "=";
  15.  
  16.     public static void main(String[] args) {
  17.         Calculator calc = new Calculator();
  18.         calc.setVisible(true);
  19.     }
  20.  
  21.     public Calculator() {
  22.         setTitle("Calculator");
  23.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  24.         setSize(300,400);
  25.         setLayout(new BorderLayout());
  26.  
  27.         JPanel textPanel= new JPanel();
  28.         textPanel.setLayout(new FlowLayout());
  29.         textField= new JTextField("0", 20);
  30.         textField.setHorizontalAlignment(JTextField.RIGHT);
  31.         textField.setBackground(Color.WHITE);
  32.         textPanel.add(textField);
  33.         add(textPanel, BorderLayout.NORTH);
  34.  
  35.         JPanel arithmeticFunctions= new JPanel();
  36.         arithmeticFunctions.setBackground(Color.WHITE);
  37.         arithmeticFunctions.setLayout(new GridLayout(5,1));
  38.  
  39.         JButton divideButton= new JButton("/");
  40.         divideButton.addActionListener(new operatorListener());
  41.         arithmeticFunctions.add(divideButton);
  42.         JButton multiplyButton= new JButton("x");
  43.         multiplyButton.addActionListener(new operatorListener());
  44.         arithmeticFunctions.add(multiplyButton);
  45.         JButton subtractButton= new JButton("-");
  46.         subtractButton.addActionListener(new operatorListener());
  47.         arithmeticFunctions.add(subtractButton);        
  48.         JButton addButton= new JButton("+");
  49.         addButton.addActionListener(new operatorListener());
  50.         arithmeticFunctions.add(addButton);
  51.         JButton equalButton= new JButton("=");
  52.         equalButton.addActionListener(new operatorListener());
  53.         arithmeticFunctions.add(equalButton);
  54.         add(arithmeticFunctions, BorderLayout.EAST);
  55.  
  56.         JPanel numberPad= new JPanel();
  57.         numberPad.setBackground(Color.WHITE);
  58.         numberPad.setLayout(new GridLayout(4,3));
  59.  
  60.         JButton seven= new JButton("7");
  61.         seven.addActionListener(new numberListener());
  62.         numberPad.add(seven);
  63.         JButton eight= new JButton("8");
  64.         eight.addActionListener(new numberListener());
  65.         numberPad.add(eight);
  66.         JButton nine= new JButton("9");
  67.         nine.addActionListener(new numberListener());
  68.         numberPad.add(nine);
  69.         JButton four= new JButton("4");
  70.         four.addActionListener(new numberListener());
  71.         numberPad.add(four);
  72.         JButton five= new JButton("5");
  73.         five.addActionListener(new numberListener());
  74.         numberPad.add(five);
  75.         JButton six= new JButton("6");
  76.         six.addActionListener(new numberListener());
  77.         numberPad.add(six);
  78.         JButton one= new JButton("1");
  79.         one.addActionListener(new numberListener());
  80.         numberPad.add(one);
  81.         JButton two= new JButton("2");
  82.         two.addActionListener(new numberListener());
  83.         numberPad.add(two);
  84.         JButton three= new JButton("3");
  85.         three.addActionListener(new numberListener());
  86.         numberPad.add(three);
  87.         JButton zero= new JButton("0");
  88.         zero.addActionListener(new numberListener());
  89.         numberPad.add(zero);
  90.         JButton decimal= new JButton(".");
  91.         decimal.addActionListener(new numberListener());
  92.         numberPad.add(decimal);
  93.         JButton posNeg= new JButton("+/=");
  94.         numberPad.add(posNeg);
  95.         add(numberPad, BorderLayout.WEST);
  96.  
  97.  
  98.         JPanel cent= new JPanel();
  99.         cent.setBackground(Color.WHITE);
  100.         cent.setLayout(new FlowLayout());
  101.  
  102.         JButton c= new JButton("C");
  103.         cent.add(c);
  104.         add(cent, BorderLayout.CENTER);
  105.     }
  106.  
  107.     private void actionClear() {
  108.         startNumber= true;
  109.         textField.setText("0");
  110.         resultTotal=0;
  111.         operator= "=";
  112.     }
  113.  
  114.     public class numberListener implements ActionListener {
  115.         public void actionPerformed(ActionEvent e) {
  116.             String number= e.getActionCommand();
  117.             if (startNumber) {
  118.                 textField.setText(number);
  119.                 startNumber= false;
  120.             }
  121.             else {
  122.                 textField.setText(textField.getText()+ number);
  123.             }   
  124.         }
  125.     }
  126.  
  127.     public class operatorListener implements ActionListener {
  128.         public void actionPerformed(ActionEvent e) {
  129.  
  130.             if (startNumber)
  131.                 actionClear();
  132.             else
  133.                 startNumber= true;
  134.  
  135.             try {
  136.                 String numOperator= textField.getText();
  137.                 int currentTotal= Integer.parseInt(numOperator);
  138.  
  139.                 if (operator.equals("/")) {
  140.                     resultTotal /= currentTotal;
  141.                 }
  142.                 else if (operator.equals("x")) {
  143.                     resultTotal *= currentTotal;
  144.                 }
  145.                 else if (operator.equals("-")) {
  146.                     resultTotal -= currentTotal;
  147.                 }
  148.                 else if (operator.equals("+")) {
  149.                     resultTotal += currentTotal;
  150.                 }
  151.  
  152.                     if (operator.equals("=")) {
  153.                     resultTotal= currentTotal;
  154.                 }
  155.                 textField.setText("" + resultTotal);
  156.             }      
  157.  
  158.             catch (NumberFormatException ex) {
  159.                 actionClear();
  160.             }
  161.  
  162.             operator= e.getActionCommand();
  163.  
  164.         }
  165.     }
  166.  
  167.  
  168. }
Nov 5 '07 #1
3 11825
sukatoa
539 Contributor
Practice the core of String handling...
M-multiplication
D-division
A-addition
S-subtraction

Assuming that you entered 7+8*2/4-6 and the answer is 5,

Here's the algo:

Capture the input "string 7+8*2/4-6"...
Convert it to character array...
seek for MDAS signs like +/*-...

for that example, obviously you will first encounter the '7', continue searching
by comparing the characters to MDAS operation...

Until you encounter +, for it is the third operation, try to get the element for your reference, like array[1] = '+' base on the assumption above...
then, continue loop...
until you get on the element that has the character ' * '...
When you are in that element, try to loop forward and backward until you incounter the next and previous operation and get that element for your reference again... for example, the '+' character is at array[2], '/' character is at array[5]...

Get the value between the * and / @ forward and also between * and + @backward...
Do the operation 8 * 2 = 16...
replace the character 8*2 into 16 in your character array...
looks like this: 7+16/4-6....
Loop again from array[0] and do the searching again... do the same way...
if no more ' * ' character, then the next character '/' is your target.... so on and so fort...

use:
for loop, while loop, array[]:comparing, etc....

you will expect more variables when you do this algo...
But when you got the idea, you can compress it...
Make it simple and sweet....


Hopefully, it helps =)
Nov 29 '07 #2
JosAH
11,448 Recognized Expert MVP
Make it simple and sweet....

Hopefully, it helps =)
Sure, how about parentheses then? e.g. (12+4)/(11-3)

kind regards,

Jos
Nov 29 '07 #3
sukatoa
539 Contributor
Same process!! but i think she will know later about that algorithm if she tries to do the first one...

If she does, she will probably design her own class/method to do the string manipulation regarding that scenario/situation...

I only gave her an example for manipulating simple inputs in the algo...
Nov 29 '07 #4

Sign in to post your reply or Sign up for a free account.

Similar topics

2
by: Michael | last post by:
Hello I am trying to write a Java-Program which converts a XML-file in a HTML. It should take the Transformation-file from the XML-file itself. Below find a possible XML-file: <?xml...
1
by: de_subhadeep | last post by:
Hi All, My program is running on a headless mode and I need to set the look and feel of my program but it gives me Headless Exception when I try to set the look and feel. The exception is as...
73
by: RobertMaas | last post by:
After many years of using LISP, I'm taking a class in Java and finding the two roughly comparable in some ways and very different in other ways. Each has a decent size library of useful utilities...
1
by: David Van D | last post by:
Hi there, A few weeks until I begin my journey towards a degree in Computer Science at Canterbury University in New Zealand, Anyway the course tutors are going to be teaching us JAVA wth bluej...
3
by: PieMan2004 | last post by:
Hi, ive been looking for a solid java community to help me when im tearing out my hair :) Basically ive constructed a GUI that has to represent the same look and functions of the typical windows...
5
by: erekose666 | last post by:
I have this program right now, but I need to modify it to output to the JTextPane. What I mean is, when someone clicks on the 1 button, it needs to output to the TextArea a 1. None of the add,...
0
oll3i
by: oll3i | last post by:
package library.common; import java.sql.ResultSet; public interface LibraryInterface { public ResultSet getBookByAuthor(String author); public ResultSet getBookByName(String name);
7
helpwithcode
by: helpwithcode | last post by:
Hi people, I am just learning java.I have been creating a project which involves JDBC Connectivity.I find that the statements, String string_dob=text_dob.getText(); //Converting string to...
3
by: zaidalin79 | last post by:
I have finally gotten my GUI to look like I want it to, but I am having trouble getting the calculations right. No matter what I put in there, it seems to calculate a large payment, and a very wrong...
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
1
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The...
0
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
0
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated ...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.