diff --git a/jsq6267/CalculatorApp.java b/jsq6267/CalculatorApp.java new file mode 100644 index 0000000..09daae2 --- /dev/null +++ b/jsq6267/CalculatorApp.java @@ -0,0 +1,146 @@ +package jsq6267; + +import javafx.application.Application; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; +import javafx.stage.Stage; + +public class CalculatorApp extends Application { + + private TextField display; + private double firstNumber = 0; + private boolean userIsTypingSecondNumber = false; + private String currentOperator = ""; + + @Override + public void start(Stage primaryStage) { + primaryStage.setTitle("计算器"); + + display = new TextField(); + display.setEditable(false); + display.setPrefColumnCount(16); + + GridPane grid = new GridPane(); + grid.setAlignment(Pos.CENTER); + grid.setPadding(new Insets(10, 10, 10, 10)); + grid.setVgap(8); + grid.setHgap(8); + + // 添加数字按钮 + for (int i = 1; i <= 9; i++) { + Button btn = new Button(String.valueOf(i)); + int finalI = i; // 使用 finalI 来捕获 i 的值 + btn.setOnAction(e -> appendNumber(finalI)); + grid.add(btn, (i - 1) % 3, (i - 1) / 3 + 1); + } + + // 添加0按钮 + Button btn0 = new Button("0"); + btn0.setOnAction(e -> appendNumber(0)); + grid.add(btn0, 0, 4, 2, 1); // 占据两列 + + // 添加点按钮 + Button btnDot = new Button("."); + btnDot.setOnAction(e -> appendDot()); + grid.add(btnDot, 2, 4); + + // 添加操作符按钮 + String[] operators = {"+", "-", "*", "/"}; + for (int i = 0; i < operators.length; i++) { + Button btnOp = new Button(operators[i]); + String finalOp = operators[i]; // 使用 finalOp 来捕获 operators[i] 的值 + btnOp.setOnAction(e -> setOperator(finalOp)); + grid.add(btnOp, 3, i + 1); + } + + // 添加等号按钮 + Button btnEquals = new Button("="); + btnEquals.setOnAction(e -> calculate()); + grid.add(btnEquals, 1, 5, 2, 1); // 占据两列 + + // 添加清除按钮 + Button btnClear = new Button("C"); + btnClear.setOnAction(e -> clear()); + grid.add(btnClear, 3, 5); + + // 将显示框添加到网格的第一行 + grid.add(display, 0, 0, 4, 1); + + Scene scene = new Scene(grid, 300, 400); + + primaryStage.setScene(scene); + primaryStage.show(); + } + + private void appendNumber(int number) { + if (userIsTypingSecondNumber) { + display.setText(display.getText() + number); + } else { + firstNumber = firstNumber * 10 + number; + display.setText(String.valueOf(firstNumber)); + } + } + + private void appendDot() { + if (!display.getText().contains(".")) { + display.setText(display.getText() + "."); + } + } + + private void setOperator(String operator) { + if (!currentOperator.isEmpty()) { + calculate(); + } + currentOperator = operator; + userIsTypingSecondNumber = true; + display.setText(""); + } + + private void calculate() { + double secondNumber = Double.parseDouble(display.getText()); + double result = 0; + boolean valid = true; + + switch (currentOperator) { + case "+": + result = firstNumber + secondNumber; + break; + case "-": + result = firstNumber - secondNumber; + break; + case "*": + result = firstNumber * secondNumber; + break; + case "/": + if (secondNumber == 0) { + display.setText("错误"); + valid = false; + } else { + result = firstNumber / secondNumber; + } + break; + } + + if (valid) { + display.setText(String.valueOf(result)); + firstNumber = result; + currentOperator = ""; + userIsTypingSecondNumber = false; + } + } + + private void clear() { + display.setText(""); + firstNumber = 0; + userIsTypingSecondNumber = false; + currentOperator = ""; + } + + public static void main(String[] args) { + launch(args); + } +}