Skip to content

as2006-ux/java-calculator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 

Repository files navigation

import javax.swing.; import java.awt.; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;

public class Calculator extends JFrame implements ActionListener {

// Calculator components
private JTextField display;
private JButton[] numberButtons;
private JButton[] functionButtons;
private JButton addButton, subButton, mulButton, divButton;
private JButton decButton, equButton, delButton, clrButton, negButton;

private JPanel panel;

private double num1 = 0, num2 = 0, result = 0;
private char operator;

public Calculator() {
    // Frame setup
    setTitle("Java Calculator");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(400, 550);
    setResizable(false);
    setLocationRelativeTo(null);
    
    // Initialize components
    initializeComponents();
    setupLayout();
    addActionListeners();
    
    setVisible(true);
}

private void initializeComponents() {
    // Display field
    display = new JTextField();
    display.setFont(new Font("Arial", Font.BOLD, 24));
    display.setHorizontalAlignment(JTextField.RIGHT);
    display.setEditable(false);
    display.setBackground(Color.WHITE);
    
    // Number buttons (0-9)
    numberButtons = new JButton[10];
    for (int i = 0; i < 10; i++) {
        numberButtons[i] = new JButton(String.valueOf(i));
        numberButtons[i].setFont(new Font("Arial", Font.BOLD, 18));
        numberButtons[i].setBackground(Color.WHITE);
    }
    
    // Function buttons
    addButton = new JButton("+");
    subButton = new JButton("-");
    mulButton = new JButton("×");
    divButton = new JButton("÷");
    decButton = new JButton(".");
    equButton = new JButton("=");
    delButton = new JButton("DEL");
    clrButton = new JButton("AC");
    negButton = new JButton("±");
    
    // Array of function buttons for easier management
    functionButtons = new JButton[]{
        addButton, subButton, mulButton, divButton,
        decButton, equButton, delButton, clrButton, negButton
    };
    
    // Style function buttons
    for (JButton button : functionButtons) {
        button.setFont(new Font("Arial", Font.BOLD, 18));
        button.setBackground(new Color(220, 220, 220));
    }
    
    // Special styling for equals button
    equButton.setBackground(new Color(70, 130, 180));
    equButton.setForeground(Color.WHITE);
    
    // Special styling for clear button
    clrButton.setBackground(new Color(220, 20, 60));
    clrButton.setForeground(Color.WHITE);
    
    panel = new JPanel();
}

private void setupLayout() {
    // Main layout
    setLayout(new BorderLayout());
    
    // Display at the top
    display.setPreferredSize(new Dimension(400, 80));
    add(display, BorderLayout.NORTH);
    
    // Button panel
    panel.setLayout(new GridLayout(5, 4, 10, 10));
    panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
    panel.setBackground(new Color(240, 240, 240));
    
    // First row
    panel.add(clrButton);
    panel.add(delButton);
    panel.add(negButton);
    panel.add(divButton);
    
    // Second row
    panel.add(numberButtons[7]);
    panel.add(numberButtons[8]);
    panel.add(numberButtons[9]);
    panel.add(mulButton);
    
    // Third row
    panel.add(numberButtons[4]);
    panel.add(numberButtons[5]);
    panel.add(numberButtons[6]);
    panel.add(subButton);
    
    // Fourth row
    panel.add(numberButtons[1]);
    panel.add(numberButtons[2]);
    panel.add(numberButtons[3]);
    panel.add(addButton);
    
    // Fifth row
    panel.add(numberButtons[0]);
    panel.add(decButton);
    panel.add(equButton);
    
    // Add empty component to maintain grid layout
    panel.add(new JLabel());
    
    add(panel, BorderLayout.CENTER);
}

private void addActionListeners() {
    // Number buttons
    for (int i = 0; i < 10; i++) {
        numberButtons[i].addActionListener(this);
    }
    
    // Function buttons
    for (JButton button : functionButtons) {
        button.addActionListener(this);
    }
}

@Override
public void actionPerformed(ActionEvent e) {
    // Number buttons
    for (int i = 0; i < 10; i++) {
        if (e.getSource() == numberButtons[i]) {
            display.setText(display.getText().concat(String.valueOf(i)));
            return;
        }
    }
    
    // Decimal point
    if (e.getSource() == decButton) {
        if (!display.getText().contains(".")) {
            display.setText(display.getText().concat("."));
        }
    }
    
    // Arithmetic operations
    if (e.getSource() == addButton) {
        num1 = Double.parseDouble(display.getText());
        operator = '+';
        display.setText("");
    }
    
    if (e.getSource() == subButton) {
        num1 = Double.parseDouble(display.getText());
        operator = '-';
        display.setText("");
    }
    
    if (e.getSource() == mulButton) {
        num1 = Double.parseDouble(display.getText());
        operator = '×';
        display.setText("");
    }
    
    if (e.getSource() == divButton) {
        num1 = Double.parseDouble(display.getText());
        operator = '÷';
        display.setText("");
    }
    
    // Equals button
    if (e.getSource() == equButton) {
        num2 = Double.parseDouble(display.getText());
        
        try {
            result = calculate(num1, num2, operator);
            display.setText(formatResult(result));
        } catch (ArithmeticException ex) {
            display.setText("Error");
        }
        
        num1 = result;
    }
    
    // Clear button
    if (e.getSource() == clrButton) {
        display.setText("");
        num1 = 0;
        num2 = 0;
        result = 0;
    }
    
    // Delete button
    if (e.getSource() == delButton) {
        String currentText = display.getText();
        if (!currentText.isEmpty()) {
            display.setText(currentText.substring(0, currentText.length() - 1));
        }
    }
    
    // Negative/Positive button
    if (e.getSource() == negButton) {
        String currentText = display.getText();
        if (!currentText.isEmpty() && !currentText.equals("0")) {
            if (currentText.charAt(0) == '-') {
                display.setText(currentText.substring(1));
            } else {
                display.setText("-" + currentText);
            }
        }
    }
}

private double calculate(double num1, double num2, char operator) {
    switch (operator) {
        case '+':
            return num1 + num2;
        case '-':
            return num1 - num2;
        case '×':
            return num1 * num2;
        case '÷':
            if (num2 == 0) {
                throw new ArithmeticException("Division by zero");
            }
            return num1 / num2;
        default:
            return 0;
    }
}

private String formatResult(double result) {
    if (result == (long) result) {
        return String.format("%d", (long) result);
    } else {
        return String.format("%s", result);
    }
}

public static void main(String[] args) {
    // Set system look and feel
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeel());
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    // Create and show calculator
    SwingUtilities.invokeLater(() -> new Calculator());
}

}

About

A GUI calculator built with Java Swing

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages