I have built a simple calculator using Swing that can perform two operations, addition and subtraction. I would like to extend the operations and add more functionality, such as multiply, divide, square, square root, etc.
I would like to know how I can improve my code in these areas:
- OOP
- Java stylings
- Readability
- Overall design and organization. Is there an architectural pattern I could be using? Are there design patterns I could be using?
Note: This is my first Java application, coming from JavaScript/ReactJS. All classes have their own file, so I just threw everything into one below. I couldn't include textfield, numbergrid, and operator classes. I was getting a message that said my post contained too much code.
public class Client {
public static void main(String[] args) {
new Calculator();
}
}
import javax.swing.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
public class Calculator implements ActionListener {
JFrame layout = new JFrame();
private JTextArea display;
private List<String> input = new ArrayList<>();
Calculator() {
new TextField(this);
new NumberGrid(this);
new Operators(this);
layout.setSize(600,500);//600 width and 500 height
layout.setLayout(null);//using no layout managers
layout.setVisible(true);//making the frame visible
}
@Override
public void actionPerformed(ActionEvent e) {
JButton buttonCalled = (JButton) e.getSource();
String buttonValue = buttonCalled.getText();
input.add(buttonValue);
display.append(buttonValue);
if (buttonValue.equals("=")) {
System.out.print("Checking for equals");
getResult();
}
}
void getResult() {
//loop through elements in ArrayList
//perform operations
String x = "";
String y = "";
String operation = "";
int finalResult = 0;
Boolean isX = true;
for (int i = 0; i < input.size(); i++) {
//check if it is a number or operations
if (isNumeric(input.get(i)) && isX) {
x += input.get(i);
}
if (input.get(i).equals("+") || input.get(i).equals("-")) {
operation = input.get(i);
isX = false;
continue;
}
if (isNumeric(input.get(i)) && !isX) {
y += input.get(i);
}
}
clearInputField(display);
switch (operation) {
case "+":
finalResult = Integer.parseInt(x) + Integer.parseInt(y);
break;
case "-":
finalResult = Integer.parseInt(x) - Integer.parseInt(y);
break;
}
showResult(display, Integer.toString(finalResult));
input.clear();
input.add(Integer.toString(finalResult));
}
void clearInputField(JTextArea field) {
field.setText("");
}
void showResult(JTextArea field, String result) {
field.setText(result);
}
public boolean isNumeric(String str) {
try
{
double d = Double.parseDouble(str);
}
catch(NumberFormatException nfe)
{
return false;
}
return true;
}
}
import javax.swing.*;
public class TextField {
TextField (Calculator calculator) {
JTextArea inputField = new JTextArea();
inputField.setBounds(130, 50, 200, 15);
calculator.layout.add(inputField);
}
}
import javax.swing.*;
import java.util.ArrayList;
public class Operators {
private ArrayList<JButton> buttonGroup = new ArrayList<JButton>();
Operators(Calculator calculator) {
buildOperator(calculator, '+', 435, 130, 40, 75);
buildOperator(calculator, '-', 435, 220, 40, 75);
buildOperator(calculator, '=', 330, 250, 100, 40);
}
void buildOperator(Calculator calculator, char operator, int x, int y, int width, int height) {
JButton newButton = new JButton(Character.toString(operator));
newButton.setBounds(x, y, width, height);
newButton.setName(Character.toString(operator));
newButton.addActionListener(calculator);
buttonGroup.add(newButton);
calculator.layout.add(newButton);
}
}
import javax.swing.*;
import java.util.ArrayList;
public class NumberGrid {
private int numberOfRows = 3;
private ArrayList<JButton> buttonGroup = new ArrayList<JButton>();
NumberGrid(Calculator calculator) {
buildRows(calculator);
buildZero(calculator);
}
void buildRows(Calculator calculator) {
int buttonWidth = 100;
int buttonHeight = 40;
int buttonXLocation = 130;
int buttonYLocation = 130;
int buttonXoffSet = 100;
int buttonYoffSet = 40;
int counter = 1;
for (int col = 1 ; col <=numberOfRows; col++) {
for (int i = 1; i <= 3; i++) {
String buttonNumber = Integer.toString(counter);
buildButton(calculator,
buttonNumber,
buttonXLocation,
buttonYLocation,
buttonWidth,
buttonHeight);
buttonXLocation += buttonXoffSet;
counter++;
}
buttonXLocation = 130;
buttonYLocation += buttonYoffSet;
}
}
void buildButton(Calculator calculator, String buttonNumber, int x, int y, int width, int height) {
JButton newButton = new JButton(buttonNumber);
newButton.setBounds(x, y, width, height);
newButton.setName(buttonNumber);
newButton.addActionListener(calculator);
buttonGroup.add(newButton);
calculator.layout.add(newButton);
}
void buildZero(Calculator calculator) {
int buttonWidth = 200;
int buttonHeight = 40;
int buttonXLocation = 130;
int buttonYLocation = 250;
String buttonNumber = Integer.toString(0);
buildButton(calculator, buttonNumber, buttonXLocation, buttonYLocation, buttonWidth, buttonHeight);
}
}