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 inputField1; // 用于显示计算记录 @FXML private TextField inputField2; private double firstNumber = 0; private String operator = ""; private boolean isOperationClicked = false; private StringBuilder currentInput = new StringBuilder(); private ObservableList 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); } }