21xrx.com
2024-09-17 03:31:37 Tuesday
登录
文章检索 我的文章 写文章
Java编程实现图形界面计算器并记录历史记录
2023-06-15 15:21:35 深夜i     --     --
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编程、图形界面程序、计算器、历史记录、集合框架、文件读写

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复