package ng;
import java.awt.EventQueue;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.ActionEvent;
import javax.swing.border.BevelBorder;
public class Calculator {
private JFrame frmCaculator;
private JTextField display;
private JTextField textField;
private double tempFirst = 0.0;
private String operator = "";
private boolean startNewNumber = true;
private boolean resultDisplayed = false;
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
try {
Calculator window = new Calculator();
window.frmCaculator.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
});
}
public Calculator() {
initialize();
}
private void initialize() {
frmCaculator = new JFrame();
frmCaculator.setFont(new Font("Consolas", Font.BOLD, 16));
frmCaculator.setTitle("Calculator");
frmCaculator.setBounds(100, 100, 300, 400);
frmCaculator.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmCaculator.getContentPane().setLayout(new BorderLayout());
frmCaculator.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_0: // Người dùng bấm phím "0"
handleNumberInput("0");
break;
case KeyEvent.VK_PLUS: // Người dùng bấm "+"
handleOperator("+");
break;
}
}
});
JPanel panel = new JPanel(new BorderLayout());
frmCaculator.getContentPane().add(panel, BorderLayout.NORTH);
display = new JTextField("0");
display.setHorizontalAlignment(SwingConstants.RIGHT);
display.setFont(new Font("Tahoma", Font.BOLD, 20));
display.setEditable(false);
panel.add(display, BorderLayout.CENTER);
display.setColumns(10);
textField = new JTextField();
textField.setHorizontalAlignment(SwingConstants.RIGHT);
textField.setFont(new Font("Tahoma", Font.PLAIN, 16));
textField.setEditable(false);
panel.add(textField, BorderLayout.NORTH);
textField.setColumns(10);
JPanel buttonPanel = new JPanel(new GridLayout(6, 4, 5, 5));
buttonPanel.setBorder(new BevelBorder(BevelBorder.LOWERED));
frmCaculator.getContentPane().add(buttonPanel, BorderLayout.CENTER);
String[] buttonLabels = {
"log", "√", "^", "!",
"%", "+/-", "C", "←",
"7", "8", "9", "/",
"4", "5", "6", "*",
"1", "2", "3", "-",
"0", ".", "=", "+"
};
for (String label : buttonLabels) {
JButton button = new JButton(label);
button.setBackground(Color.GREEN);
button.setForeground(Color.RED);
button.setFont(new Font("Tahoma", Font.PLAIN, 18));
button.addActionListener(e -> handleButtonPress(e.getActionCommand()));
buttonPanel.add(button);
}
}
private void handleButtonPress(String cmd) {
if (cmd.matches("\\d") || cmd.equals(".")) {
handleNumberInput(cmd);
} else {
switch (cmd) {
case "C": clearAll(); break;
case "←": deleteLastDigit(); break;
case "=": performCalculation(); break;
case "%": handlePercentage(); break;
case "√": handleSquareRoot(); break;
case "^": handleOperator(cmd); break;
case "!": handleFactorial(); break;
case "+/-": toggleSign(); break;
case "log": handleLog(); break;
default: handleOperator(cmd);
}
}
}
private void handleNumberInput(String input) {
if (resultDisplayed) {
display.setText(input);
textField.setText(input); // Reset biểu thức khi có kết quả mới
resultDisplayed = false;
} else if (startNewNumber) {
//display.setText(input);
textField.setText(textField.getText() + input); // Nối số vào biểu thức
startNewNumber = false;
} else {
//display.setText(display.getText() + input);
textField.setText(textField.getText() + input); // Nối tiếp số vào biểu thức
}
}
private void handleOperator(String cmd) {
// tempFirst = Double.parseDouble(textField.getText());
operator = cmd;
System.out.println("ll="+operator);
textField.setText(textField.getText() + " " + cmd + " "); // Nối phép toán vào biểu thức
startNewNumber = true;
resultDisplayed = false;
}
// private void performCalculation() {
// if (!operator.isEmpty()) {
// double tempSecond = Double.parseDouble(display.getText());
// double result = calculate(tempFirst, tempSecond, operator);
// display.setText(formatResult(result));
// tempFirst = result;
// operator = "";
// startNewNumber = true;
// resultDisplayed = true;
// }
// }
private void performCalculation() {
if (!operator.isEmpty()) {
// Tách biểu thức trong textField thành các phần tử
String[] tokens = textField.getText().split(" ");
if (tokens.length == 3) {
try {
double tempFirst = Double.parseDouble(tokens[0]);
double tempSecond = Double.parseDouble(tokens[2]);
double result = calculate(tempFirst, tempSecond, operator);
display.setText(formatResult(result));
//textField.setText(""); // Xóa biểu thức sau khi tính toán
operator = "";
startNewNumber = true;
resultDisplayed = true;
} catch (NumberFormatException e) {
display.setText("Lỗi");
}
}
}
}
private void handleSquareRoot() {
double value = Double.parseDouble(display.getText());
display.setText(formatResult(Math.sqrt(value)));
}
private void handleLog() {
double value = Double.parseDouble(display.getText());
display.setText(formatResult(Math.log10(value)));
}
private void handlePercentage() {
double value = Double.parseDouble(display.getText());
display.setText(formatResult(value / 100));
}
private void handleFactorial() {
int value = Integer.parseInt(display.getText());
display.setText(String.valueOf(factorial(value)));
}
private void toggleSign() {
double value = Double.parseDouble(display.getText());
display.setText(formatResult(-value));
}
private void deleteLastDigit() {
String text = display.getText();
display.setText(text.length() > 1 ? text.substring(0, text.length() - 1) : "0");
}
private void clearAll() {
display.setText("0");
textField.setText("");
tempFirst = 0.0;
operator = "";
startNewNumber = true;
resultDisplayed = false;
}
private double calculate(double a, double b, String operator) {
return switch (operator) {
case "+" -> a + b;
case "-" -> a - b;
case "*" -> a * b;
case "/" ->{
if (b == 0) {
JOptionPane.showMessageDialog(frmCaculator, "Lỗi: Không thể chia cho 0", "Error", JOptionPane.ERROR_MESSAGE);
yield 0;
}
yield a / b;}
case "^" -> Math.pow(a, b);
default -> 0;
};
}
public static long factorial(int n) {
long result = 1;
for (int i = 2; i <= n; i++) result *= i;
return result;
}
private String formatResult(double result) {
return result == (int) result ? String.valueOf((int) result) : String.valueOf(result);
}
}
Không có nhận xét nào:
Đăng nhận xét