simple calculator

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SimpleCalculator extends JFrame implements ActionListener {
    // Components
    private JTextField display;
    private JPanel buttonPanel;
    private double num1 = 0, num2 = 0, result = 0;
    private char operator;
    private boolean startNewNumber = true;

    public SimpleCalculator() {
        // Set up the frame
        setTitle("Simple Calculator");
        setSize(350, 450);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout(10, 10));
        setResizable(false);

        // Create display field
        display = new JTextField("0");
        display.setFont(new Font("Arial", Font.BOLD, 24));
        display.setHorizontalAlignment(JTextField.RIGHT);
        display.setEditable(false);
        display.setBackground(Color.WHITE);
        display.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        add(display, BorderLayout.NORTH);

        // Create button panel
        buttonPanel = new JPanel();
        buttonPanel.setLayout(new GridLayout(5, 4, 5, 5));
        buttonPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

        // Button labels
        String[] buttons = {
            "7", "8", "9", "/",
            "4", "5", "6", "*",
            "1", "2", "3", "-",
            "0", ".", "=", "+",
            "C", "CE", "√", "%"
        };

        // Create and add buttons
        for (String text : buttons) {
            JButton button = new JButton(text);
            button.setFont(new Font("Arial", Font.BOLD, 18));
            button.addActionListener(this);
            button.setFocusPainted(false);
            
            // Color coding for different button types
            if (text.matches("[0-9]") || text.equals(".")) {
                button.setBackground(new Color(240, 240, 240));
            } else if (text.equals("=")) {
                button.setBackground(new Color(100, 180, 255));
                button.setForeground(Color.WHITE);
            } else if (text.equals("C") || text.equals("CE")) {
                button.setBackground(new Color(255, 100, 100));
                button.setForeground(Color.WHITE);
            } else {
                button.setBackground(new Color(220, 220, 220));
            }
            
            buttonPanel.add(button);
        }

        add(buttonPanel, BorderLayout.CENTER);

        // Center the window on screen
        setLocationRelativeTo(null);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();

        try {
            // Number buttons and decimal point
            if (command.matches("[0-9]") || command.equals(".")) {
                if (startNewNumber) {
                    if (command.equals(".")) {
                        display.setText("0.");
                    } else {
                        display.setText(command);
                    }
                    startNewNumber = false;
                } else {
                    if (command.equals(".") && display.getText().contains(".")) {
                        return; // Prevent multiple decimal points
                    }
                    display.setText(display.getText() + command);
                }
            }
            // Clear button
            else if (command.equals("C")) {
                display.setText("0");
                num1 = num2 = result = 0;
                operator = ' ';
                startNewNumber = true;
            }
            // Clear Entry button
            else if (command.equals("CE")) {
                display.setText("0");
                startNewNumber = true;
            }
            // Square root
            else if (command.equals("√")) {
                double value = Double.parseDouble(display.getText());
                if (value < 0) {
                    display.setText("Error");
                } else {
                    result = Math.sqrt(value);
                    display.setText(formatResult(result));
                }
                startNewNumber = true;
            }
            // Percentage
            else if (command.equals("%")) {
                double value = Double.parseDouble(display.getText());
                result = value / 100;
                display.setText(formatResult(result));
                startNewNumber = true;
            }
            // Operators
            else if (command.matches("[+\\-*/]")) {
                num1 = Double.parseDouble(display.getText());
                operator = command.charAt(0);
                startNewNumber = true;
            }
            // Equals button
            else if (command.equals("=")) {
                num2 = Double.parseDouble(display.getText());
                
                switch (operator) {
                    case '+':
                        result = num1 + num2;
                        break;
                    case '-':
                        result = num1 - num2;
                        break;
                    case '*':
                        result = num1 * num2;
                        break;
                    case '/':
                        if (num2 == 0) {
                            display.setText("Cannot divide by 0");
                            startNewNumber = true;
                            return;
                        }
                        result = num1 / num2;
                        break;
                    default:
                        return;
                }
                
                display.setText(formatResult(result));
                num1 = result;
                startNewNumber = true;
            }
        } catch (NumberFormatException ex) {
            display.setText("Error");
            startNewNumber = true;
        }
    }

    // Format the result to remove unnecessary decimal places
    private String formatResult(double result) {
        if (result == (long) result) {
            return String.format("%d", (long) result);
        } else {
            return String.format("%.8f", result).replaceAll("0*$", "").replaceAll("\\.$", "");
        }
    }

    public static void main(String[] args) {
        // Use SwingUtilities to ensure thread safety
        SwingUtilities.invokeLater(() -> {
            SimpleCalculator calculator = new SimpleCalculator();
            calculator.setVisible(true);
        });
    }
}

Scroll to Top