21xrx.com
2025-04-24 03:43:50 Thursday
文章检索 我的文章 写文章
Java编程实现图形界面计算器并记录历史记录
2023-06-15 15:21:35 深夜i     17     0
Java编程 图形界面程序 计算器 历史记录 集合框架 文件读写

在日常生活中,计算器是我们常用的一个工具,而计算器程序的开发也是Java编程中很基础的内容之一。本文将介绍如何使用Java编写一款图形界面的计算器程序,并记录计算历史记录。

1. 实现基本的计算器功能

首先,我们需要实现基本的计算器功能,包括数字按钮、运算符按钮、等号按钮、清空按钮等。我们可以使用JavaFX来实现图形界面,下面是示例代码:

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.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class Calculator extends Application {
  private TextField txtResult;
  private String operator = "";
  private double firstNumber = 0;
  private double secondNumber = 0;
  @Override
  public void start(Stage primaryStage) {
    txtResult = new TextField();
    txtResult.setEditable(false);
    txtResult.setAlignment(Pos.CENTER_RIGHT);
    Button btn0 = new Button("0");
    btn0.setOnAction(e -> handleNumberButton(e));
    Button btn1 = new Button("1");
    btn1.setOnAction(e -> handleNumberButton(e));
    Button btn2 = new Button("2");
    btn2.setOnAction(e -> handleNumberButton(e));
    Button btn3 = new Button("3");
    btn3.setOnAction(e -> handleNumberButton(e));
    Button btn4 = new Button("4");
    btn4.setOnAction(e -> handleNumberButton(e));
    Button btn5 = new Button("5");
    btn5.setOnAction(e -> handleNumberButton(e));
    Button btn6 = new Button("6");
    btn6.setOnAction(e -> handleNumberButton(e));
    Button btn7 = new Button("7");
    btn7.setOnAction(e -> handleNumberButton(e));
    Button btn8 = new Button("8");
    btn8.setOnAction(e -> handleNumberButton(e));
    Button btn9 = new Button("9");
    btn9.setOnAction(e -> handleNumberButton(e));
    Button btnPlus = new Button("+");
    btnPlus.setOnAction(e -> handleOperatorButton(e));
    Button btnMinus = new Button("-");
    btnMinus.setOnAction(e -> handleOperatorButton(e));
    Button btnMultiply = new Button("*");
    btnMultiply.setOnAction(e -> handleOperatorButton(e));
    Button btnDivide = new Button("/");
    btnDivide.setOnAction(e -> handleOperatorButton(e));
    Button btnEqual = new Button("=");
    btnEqual.setOnAction(e -> handleEqualButton(e));
    Button btnClear = new Button("AC");
    btnClear.setOnAction(e -> handleClearButton(e));
    HBox hbox1 = new HBox();
    hbox1.getChildren().addAll(btn7, btn8, btn9, btnPlus);
    hbox1.setSpacing(10);
    hbox1.setPadding(new Insets(10, 10, 10, 10));
    HBox hbox2 = new HBox();
    hbox2.getChildren().addAll(btn4, btn5, btn6, btnMinus);
    hbox2.setSpacing(10);
    hbox2.setPadding(new Insets(10, 10, 10, 10));
    HBox hbox3 = new HBox();
    hbox3.getChildren().addAll(btn1, btn2, btn3, btnMultiply);
    hbox3.setSpacing(10);
    hbox3.setPadding(new Insets(10, 10, 10, 10));
    HBox hbox4 = new HBox();
    hbox4.getChildren().addAll(btn0, btnEqual, btnClear, btnDivide);
    hbox4.setSpacing(10);
    hbox4.setPadding(new Insets(10, 10, 10, 10));
    GridPane pane = new GridPane();
    pane.setAlignment(Pos.CENTER);
    pane.add(txtResult, 0, 0, 4, 1);
    pane.add(hbox1, 0, 1);
    pane.add(hbox2, 0, 2);
    pane.add(hbox3, 0, 3);
    pane.add(hbox4, 0, 4);
    Scene scene = new Scene(pane, 300, 300);
    primaryStage.setScene(scene);
    primaryStage.show();
  }
  private void handleNumberButton(ActionEvent e) {
    Button btn = (Button) e.getSource();
    String number = btn.getText();
    txtResult.setText(txtResult.getText() + number);
  }
  private void handleOperatorButton(ActionEvent e) {
    Button btn = (Button) e.getSource();
    operator = btn.getText();
    firstNumber = Double.parseDouble(txtResult.getText());
    txtResult.setText("");
  }
  private void handleEqualButton(ActionEvent e) {
    if (!txtResult.getText().equals("")) {
      secondNumber = Double.parseDouble(txtResult.getText());
      double result = 0;
      switch (operator) {
        case "+":
          result = firstNumber + secondNumber;
          break;
        case "-":
          result = firstNumber - secondNumber;
          break;
        case "*":
          result = firstNumber * secondNumber;
          break;
        case "/":
          result = firstNumber / secondNumber;
          break;
      }
      txtResult.setText(String.valueOf(result));
    }
  }
  private void handleClearButton(ActionEvent e) {
    operator = "";
    firstNumber = 0;
    secondNumber = 0;
    txtResult.setText("");
  }
}

2. 记录计算历史记录

我们要在计算器程序中加入记录历史记录的功能,可以使用Java的集合框架来实现。我们定义一个List集合来存储计算记录,每次进行一次运算后,将运算表达式以及对应的结果加入到List中,最终将List保存到文件中,下次打开计算器程序时可以将历史记录文件读取到List中显示出来。下面是示例代码:

import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Calculator {
  // 省略上述代码
  private List
  historyList = new ArrayList<>();
 
  private void handleEqualButton(ActionEvent e) {
    if (!txtResult.getText().equals("")) {
      secondNumber = Double.parseDouble(txtResult.getText());
      double result = 0;
      switch (operator) {
        case "+":
          result = firstNumber + secondNumber;
          historyList.add(firstNumber + " + " + secondNumber + " = " + result);
          break;
        case "-":
          result = firstNumber - secondNumber;
          historyList.add(firstNumber + " - " + secondNumber + " = " + result);
          break;
        case "*":
          result = firstNumber * secondNumber;
          historyList.add(firstNumber + " * " + secondNumber + " = " + result);
          break;
        case "/":
          result = firstNumber / secondNumber;
          historyList.add(firstNumber + " / " + secondNumber + " = " + result);
          break;
      }
      txtResult.setText(String.valueOf(result));
      saveHistoryList();
    }
  }
  private void saveHistoryList() {
    try {
      BufferedWriter writer = new BufferedWriter(new FileWriter("history.txt"));
      for (String s : historyList) {
        writer.write(s);
        writer.newLine();
      }
      writer.close();
    } catch (IOException e) {
      Alert alert = new Alert(AlertType.WARNING);
      alert.setTitle("警告");
      alert.setHeaderText("文件写入失败");
      alert.showAndWait();
    }
  }
  private List
  loadHistoryList() {
 
    List
  list = new ArrayList<>();
 
    try {
      BufferedReader reader = new BufferedReader(new FileReader("history.txt"));
      String line;
      while ((line = reader.readLine()) != null) {
        list.add(line);
      }
      reader.close();
    } catch (IOException e) {
      Alert alert = new Alert(AlertType.WARNING);
      alert.setTitle("警告");
      alert.setHeaderText("文件读取失败");
      alert.showAndWait();
    }
    return list;
  }
}

3. 关键词

Java编程、图形界面程序、计算器、历史记录、集合框架、文件读写

  
  

评论区