You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Calculator/CalculatorController.java

179 lines
6.1 KiB

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.control.Button;
import javafx.event.ActionEvent;
public class CalculatorController {
@FXML
private TextField inputField; // 用于显示输入
@FXML
private ListView<String> inputField1; // 用于显示计算记录
@FXML
private TextField inputField2;
private double firstNumber = 0;
private String operator = "";
private boolean isOperationClicked = false;
private StringBuilder currentInput = new StringBuilder();
private ObservableList<String> operationHistory = FXCollections.observableArrayList();
@FXML
protected void handleNumberAction(ActionEvent event) {
Button button = (Button) event.getSource();
String number = button.getText();
if (isOperationClicked) {
currentInput.setLength(0);
isOperationClicked = false;
}
currentInput.append(number);
inputField.setText(currentInput.toString());
}
@FXML
protected void handleAddAction(ActionEvent event) {
performOperation("+");
}
@FXML
protected void handleSubtractAction(ActionEvent event) {
performOperation("-");
}
@FXML
protected void handleMultiplyAction(ActionEvent event) {
performOperation("*");
}
@FXML
protected void handleDivideAction(ActionEvent event) {
performOperation("/");
}
@FXML
protected void handleModulusAction(ActionEvent event) {
performOperation("%");
}
private void performOperation(String op) {
if (currentInput.length() > 0) {
// 如果当前输入不为空,先保存当前输入为第二个数字
if (firstNumber != 0 && !operator.isEmpty()) {
handleEqualAction(null); // 计算上一个结果
} else {
firstNumber = Double.parseDouble(currentInput.toString()); // 设置第一个数字
}
}
String firstNumberText = (firstNumber % 1 == 0) ? String.valueOf((int) firstNumber) : String.valueOf(firstNumber);
operator = op;
isOperationClicked = true;
currentInput.append(operator);
inputField.setText(firstNumberText + " " + operator + " "); // 显示当前操作
}
@FXML
protected void handleEqualAction(ActionEvent event) {
if (currentInput.length() == 0 || operator.isEmpty()) {
return; // 如果没有输入或操作符,则不进行计算
}
double secondNumber = Double.parseDouble(currentInput.toString());
double result = 0;
switch (operator) {
case "+":
result = firstNumber + secondNumber;
break;
case "-":
result = firstNumber - secondNumber;
break;
case "*":
result = firstNumber * secondNumber;
break;
case "/":
if (secondNumber != 0) {
result = firstNumber / secondNumber;
} else {
inputField.setText("Error");
return;
}
break;
case "%":
result = firstNumber % secondNumber;
break;
default:
return;
}
// 格式化输出结果
String resultText = (result % 1 == 0) ? String.valueOf((int) result) : String.valueOf(result);
inputField.setText(resultText);
recordOperation(firstNumber, secondNumber, Double.parseDouble(resultText));
firstNumber = result; // 使用当前结果作为下一个操作的第一个数字
currentInput.setLength(0); // 清空当前输入
operator = ""; // 重置操作符
isOperationClicked = false; // 重置操作标记
}
private void recordOperation(double firstNumber, double secondNumber, double result) {
// 检查结果是否为整数
String formattedResult = (result % 1 == 0) ? String.valueOf((int) result) : String.valueOf(result);
//检查firstNumber是否为整数
String firstNumberText = (firstNumber % 1 == 0) ? String.valueOf((int) firstNumber) : String.valueOf(firstNumber);
//检查secondNumber是否为整数
String secondNumberText = (secondNumber % 1 == 0) ? String.valueOf((int) secondNumber) : String.valueOf(secondNumber);
String operation = firstNumberText + " " + operator + " " + secondNumberText + " = " + formattedResult;
// 更新计算记录,确保换行符的正确使用
operationHistory.add(operation);
inputField1.setItems(operationHistory);
}
@FXML
protected void handleClearAction(ActionEvent event) {
if (currentInput.length() > 0) {
// 移除最后一个字符
currentInput.deleteCharAt(currentInput.length() - 1);
// 如果最后一个字符是空格且还有字符,继续删除空格(用于清理运算符后面的空格)
while (currentInput.length() > 0 && currentInput.charAt(currentInput.length() - 1) == ' ') {
currentInput.deleteCharAt(currentInput.length() - 1);
}
// 如果删除后为空且有操作符,则清空操作符
if (currentInput.length() == 0 && !operator.isEmpty()) {
operator = "";
}
inputField.setText(currentInput.toString());
}
}
@FXML
protected void handleClearsAction(ActionEvent event) {
currentInput.setLength(0);
firstNumber = 0;
operator = "";
inputField.clear();
}
@FXML
protected void handlePointAction(ActionEvent event) {
if (currentInput.indexOf(".") == -1) { // 检查是否已有小数点
currentInput.append(".");
inputField.setText(currentInput.toString());
}
}
@FXML
protected void handleRemoveAction(ActionEvent event) {
operationHistory.clear();
inputField1.setItems(operationHistory);
}
}