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