diff --git a/src/main/java/com/mycompany/javacalculator/ButtonRow.java b/src/main/java/com/mycompany/javacalculator/ButtonRow.java new file mode 100644 index 0000000..e80fed9 --- /dev/null +++ b/src/main/java/com/mycompany/javacalculator/ButtonRow.java @@ -0,0 +1,34 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.mycompany.javacalculator; + +import javax.swing.JButton; +import javax.swing.JPanel; + +/** + * + * @author mikayladobson + */ +public class ButtonRow extends JPanel { + public ButtonRow() {} + + public ButtonRow(JButton btn) { + addToRow(btn); + } + + public ButtonRow(JButton[] buttons) { + addToRow(buttons); + } + + public void addToRow(JButton btn) { + this.add(btn); + } + + public void addToRow(JButton[] buttons) { + for (JButton btn : buttons) { + this.add(btn); + } + } +} diff --git a/src/main/java/com/mycompany/javacalculator/JavaCalculator.java b/src/main/java/com/mycompany/javacalculator/JavaCalculator.java index bc19c90..45c9778 100644 --- a/src/main/java/com/mycompany/javacalculator/JavaCalculator.java +++ b/src/main/java/com/mycompany/javacalculator/JavaCalculator.java @@ -4,44 +4,102 @@ package com.mycompany.javacalculator; +import java.awt.Color; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; -import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; +import com.mycompany.javacalculator.Operands.Operand; +import java.util.Collection; +import javax.swing.JButton; /** * * @author mikayladobson */ public class JavaCalculator implements ActionListener { + private float storedNum = 0; + private float receivedNum = 0; + private String receivedData = ""; + private Operand operand = null; + private final JFrame frame; - private final JLabel label; private final JPanel mainPanel; + private final JPanel calculatorScreen; + private final JLabel screenText; + private final NumButton btn1; private final NumButton btn2; private final NumButton btn3; + private final NumButton btn4; + private final NumButton btn5; + private final NumButton btn6; + private final NumButton btn7; + private final NumButton btn8; + private final NumButton btn9; + private final NumButton btn0; + + private final OpButton btnPlus; + private final OpButton btnMinus; + private final OpButton btnMultiply; + private final OpButton btnDivide; + private final OpButton btnExponent; + private final OpButton btnEquals; + private final OpButton btnDecimal; public JavaCalculator() { frame = new JFrame(); - label = new JLabel("Initial value"); + screenText = new JLabel("Initial value"); mainPanel = new JPanel(); mainPanel.setBorder(BorderFactory.createEmptyBorder(100,100,100,100)); - mainPanel.setLayout(new GridLayout(4, 4)); - mainPanel.add(label); + mainPanel.setLayout(new GridLayout(4, 4)); + + calculatorScreen = new JPanel(); + calculatorScreen.add(screenText); + calculatorScreen.setBackground(Color.GRAY); + + mainPanel.add(calculatorScreen); btn1 = new NumButton(1, this); btn2 = new NumButton(2, this); - btn3 = new NumButton(3, this); + btn3 = new NumButton(3, this); + btn4 = new NumButton(4, this); + btn5 = new NumButton(5, this); + btn6 = new NumButton(6, this); + btn7 = new NumButton(7, this); + btn8 = new NumButton(8, this); + btn9 = new NumButton(9, this); + btn0 = new NumButton(0, this); - mainPanel.add(btn1); - mainPanel.add(btn2); - mainPanel.add(btn3); + btnPlus = new OpButton(Operand.ADD, this); + btnMinus = new OpButton(Operand.SUBTRACT, this); + btnMultiply = new OpButton(Operand.MULTIPLY, this); + btnDivide = new OpButton(Operand.DIVIDE, this); + btnExponent = new OpButton(Operand.EXPONENT, this); + btnEquals = new OpButton(Operand.EQUALS, this); + btnDecimal = new OpButton(Operand.DECIMAL, this); + + NumButton[] numBtns = { btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn0 }; + OpButton[] opBtns = { btnPlus, btnMinus, btnMultiply, btnDivide, btnExponent, btnEquals, btnDecimal }; + + RowFactory rowFactory = new RowFactory(numBtns); + Collection btnRows = rowFactory.getRows(); + + for (ButtonRow row : btnRows) { + mainPanel.add(row); + } + + rowFactory.setRows(opBtns); + btnRows = rowFactory.getRows(); + + for (ButtonRow row : btnRows) { + mainPanel.add(row); + } frame.add(mainPanel); frame.setTitle("Calculator"); @@ -57,7 +115,7 @@ public class JavaCalculator implements ActionListener { @Override public void actionPerformed(ActionEvent e) { - NumButton source = (NumButton)e.getSource(); - label.setText(source.getText()); + JButton source = (JButton)e.getSource(); + screenText.setText(source.getText()); } } diff --git a/src/main/java/com/mycompany/javacalculator/OpButton.java b/src/main/java/com/mycompany/javacalculator/OpButton.java new file mode 100644 index 0000000..62ed66d --- /dev/null +++ b/src/main/java/com/mycompany/javacalculator/OpButton.java @@ -0,0 +1,22 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.mycompany.javacalculator; + +import javax.swing.JButton; +import com.mycompany.javacalculator.Operands.Operand; + +/** + * + * @author mikayladobson + */ +public class OpButton extends JButton { + private final Operand operand; + + public OpButton(Operand operand, JavaCalculator calculator) { + this.operand = operand; + this.addActionListener(calculator); + this.setText(Operands.toLabel(operand)); + } +} diff --git a/src/main/java/com/mycompany/javacalculator/Operands.java b/src/main/java/com/mycompany/javacalculator/Operands.java new file mode 100644 index 0000000..f132966 --- /dev/null +++ b/src/main/java/com/mycompany/javacalculator/Operands.java @@ -0,0 +1,45 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.mycompany.javacalculator; + +/** + * + * @author mikayladobson + */ +public class Operands { + public enum Operand { + ADD, SUBTRACT, MULTIPLY, DIVIDE, EXPONENT, + EQUALS, DECIMAL + } + + public static String toLabel(Operand input) { + switch (input) { + case ADD -> { + return "+"; + } + case SUBTRACT -> { + return "-"; + } + case MULTIPLY -> { + return "*"; + } + case DIVIDE -> { + return "/"; + } + case EXPONENT -> { + return "^"; + } + case DECIMAL -> { + return "."; + } + case EQUALS -> { + return "="; + } + default -> { + throw new Error("Invalid operand input"); + } + } + } +} diff --git a/src/main/java/com/mycompany/javacalculator/RowFactory.java b/src/main/java/com/mycompany/javacalculator/RowFactory.java new file mode 100644 index 0000000..383a896 --- /dev/null +++ b/src/main/java/com/mycompany/javacalculator/RowFactory.java @@ -0,0 +1,47 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.mycompany.javacalculator; + +import java.util.ArrayList; +import java.util.Collection; +import javax.swing.JButton; + +/** + * + * @author mikayladobson + */ +public class RowFactory { + private Collection allRows; + + public RowFactory() { + allRows = new ArrayList(); + } + + public RowFactory(JButton[] btns) { + setRows(btns); + } + + public void setRows(JButton[] btns) { + allRows = new ArrayList(); + int remaining = 0; + + while (remaining < btns.length) { + ButtonRow product = new ButtonRow(); + + int i = 0; + while (remaining < btns.length && i < 3) { + product.add(btns[remaining]); + remaining++; + i++; + } + + allRows.add(product); + } + } + + public Collection getRows() { + return this.allRows; + } +}