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.
179 lines
6.1 KiB
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);
|
|
}
|
|
}
|