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);
});
}
}