当前位置:   article > 正文

一个Java的简易计算器_用java编写一个简单的计算器

用java编写一个简单的计算器

一、人员分工

任务姓名
计算、粘贴功能陈炜棋
界面放置、按键监控林炳坚

二、系统功能架构图

三、系统描述

  仿照Windows计算器,编写一具有GUI的计算器,能实现整数的加、减、乘、除四则运算,并且需要支持键盘快捷键,基本可取代windows计算器。支持复制、粘贴功能,方便输入长串数字。

四、功能说明

1.界面放置

代码中包括了创建清除按钮、数字和运算符按钮数组,并设置它们的位置、大小和样式。同时,还设置了计算式文本框和计算结果文本框的位置、大小和样式。清除按钮的功能是清空计算式和结果文本框的内容。数字和运算符按钮数组通过循环放置到窗口中,并设置了它们的位置、大小和样式。整个窗口的布局采用了自定义布局,即使用绝对位置和大小来布局组件。

2.按键监控

实现了为按钮添加动作监听器以及键盘事件监听器,从而实现了按钮点击和键盘输入的功能。

  1. 为每个按钮添加监听器:通过遍历按钮数组,为每个按钮添加动作监听器,以便在按钮被点击时执行相应的操作。

  2. 设置窗口相关属性:设置窗口大小、位置,窗口关闭操作为直接关闭,使窗口可见,并设置窗口获得焦点。

  3. 为粘贴按钮添加监听器:为“粘贴”按钮添加监听器,当按钮被点击时,从系统剪贴板获取内容,并将内容设置到计算式文本框中。

  4. 添加键盘事件监听器:通过添加键盘事件监听器,捕获键盘输入。在键盘输入时,根据输入的字符进行相应的处理,包括数字、小数点、运算符和等号的处理。具体功能包括:

    • 追加数字或小数点到键盘输入缓冲区,并更新计算式文本框内容。
    • 处理运算符或等号的输入,根据当前的操作数和运算符状态更新计算式文本框,并调用result函数计算结果。

3.运算功能

主要包括以下功能:

  1. result方法:根据传入的运算符z,对操作数num1和num2进行相应的加减乘除运算,并将结果显示在结果文本框中。同时清空操作数2和运算符。

  2. actionPerformed方法:处理按钮的点击事件。根据按钮的动作命令字符串cmd,分别处理数字和小数点按钮的点击,以及加减乘除等号按钮的点击。

    • 当点击数字和小数点按钮时,根据当前运算符状态,将数字追加到操作数1或操作数2,并在计算式文本框中显示完整的计算式。
    • 当点击加减乘除按钮时,根据当前操作数和运算符状态进行相应的运算,并更新计算式文本框的显示内容。
    • 当点击等号按钮时,调用result方法计算结果,并显示在结果文本框中。

4.粘贴功能

实现粘贴功能的方法。该方法首先获取系统剪贴板的内容,然后尝试将内容转换为字符串类型并返回。如果剪贴板的内容为空或不支持字符串类型,则返回空。

在实现过程中,使用了java.awt包中的Toolkit类和Clipboard类,以及java.awt.datatransfer包中的Transferable类和DataFlavor类来获取和处理系统剪贴板的内容。同时,还处理了可能出现的不支持的数据类型和输入输出异常,并进行了相应的异常处理。

五、关键代码

  1. package Ks;
  2. import javax.swing.JFrame;//创建和管理窗口框架的类。在这里,它用于创建计算器应用程序的主窗口
  3. import javax.swing.JTextField;//一个用于输入或显示单行文本的文本框组件。在这里,它用于显示计算式和计算结果
  4. import javax.swing.JButton;//提供了一个按钮组件,用户可以点击按钮执行相应的操作。在这里,它用于创建数字按钮和粘贴按钮
  5. import javax.swing.SwingConstants;//提供了一些常量,用于指定文本或图标在组件中的对齐方式。在这里可能被用于设置文本框的对齐方式
  6. import java.awt.event.ActionListener;//用于处理用户接口组件的动作事件(如按钮点击)。在这里,它用于监听按钮的点击事件
  7. import java.awt.event.ActionEvent;//表示由用户界面组件(如按钮)生成的动作事件。在这里,它用于处理按钮的点击事件
  8. import java.awt.Font;//表示字体。在这里,它用于设置文本框和按钮的字体样式
  9. import java.awt.Toolkit;//提供了一种获取系统相关信息的途径。在这里,它用于获取系统剪贴板
  10. import java.awt.datatransfer.Clipboard;//提供了访问剪贴板的类。在这里,它用于访问系统剪贴板
  11. import java.awt.datatransfer.DataFlavor;//表示数据的类型,用于在剪贴板之间传输数据。在这里,它用于指定要获取的剪贴板数据的类型
  12. import java.awt.datatransfer.Transferable;//表示可以传输的数据。在这里,它用于表示从剪贴板获取的数据
  13. import java.awt.datatransfer.UnsupportedFlavorException;//表示不支持的数据类型。在这里,它用于处理不支持的剪贴板数据类型
  14. import java.awt.Color;//表示颜色。在这里,它用于设置文本框和按钮的颜色
  15. import java.awt.event.KeyEvent;//表示键盘事件。在这里,它用于处理键盘输入事件
  16. import java.io.IOException;//表示输入或输出过程中出现的异常。在这里,它用于处理输入/输出异常
  17. import java.awt.event.KeyAdapter;//提供了键盘事件的适配器类。在这里,它用于处理键盘事件的适配器
  18. import java.util.regex.*;//提供了正则表达式的支持。在这里,它用于处理文本框中的输入
  19. import java.math.BigDecimal;//提供了高精度的数学运算。在这里,它用于执行计算
  20. public class Calculator extends JFrame implements ActionListener {
  21. private JTextField expText = new JTextField();// 第一行:计算式
  22. private JTextField resultText = new JTextField("0");// 第二行:计算结果,设初始值为0
  23. private String num1="",num2="";//两个操作数
  24. private String fh=""; //运算符
  25. private BigDecimal r; //计算结果
  26. public Calculator() {// 构造方法
  27. // 调用父类的构造函数
  28. super("计算器");
  29. String[] keysValue= { "7", "8", "9", "÷", "4", "5", "6",
  30. "×", "1", "2", "3", "-", "0",".", "+","=" };//各个按钮上的文字
  31. String[] actionCmd= { "7", "8", "9", "/", "4", "5", "6",
  32. "*", "1", "2", "3", "-", "0",".", "+","=" };//各个按钮上的动作命令标识
  33. JButton pasteButton = new JButton("粘贴");// 创建一个名为“粘贴”的按钮
  34. pasteButton.setBounds(180, 10, 70, 40);// 设置按钮的位置和大小
  35. pasteButton.setFont(getFont());// 设置按钮的字体样式
  36. this.add(pasteButton);// 将按钮添加到窗口中
  37. JButton keys[]=new JButton[keysValue.length]; // 创建按钮数组,用于存储数字按钮和运算符按钮
  38. Font font=new Font("宋体",Font.PLAIN,18); // 创建字体对象,指定字体样式为宋体,正常样式,字号为18
  39. // 设置计算式文本框的位置、宽度和高度
  40. expText.setBounds(10, 10, 240, 40);
  41. expText.setFont(font); // 设置计算式文本框的字体样式
  42. expText.setBackground(Color.white); // 设置计算式文本框的背景颜色为白色
  43. expText.setEditable(false); // 计算式文本框不可编辑,只用于显示计算式
  44. // 设置计算结果文本框的位置、宽度和高度
  45. resultText.setBounds(10, 50, 240, 40);
  46. resultText.setFont(font); // 设置计算结果文本框的字体样式
  47. resultText.setBackground(Color.white); // 设置计算结果文本框的背景颜色为白色
  48. resultText.setHorizontalAlignment(SwingConstants.LEFT); // 设置计算结果文本框的对齐方式为左对齐
  49. resultText.setEditable(false); // 计算结果文本框不可编辑,只用于显示计算结果
  50. this.setLayout(null); // 设置窗口的布局为自定义布局,即使用绝对位置和大小来布局组件
  51. this.add(expText); // 将计算式文本框添加到窗口中
  52. this.add(resultText); // 将计算结果文本框添加到窗口中
  53. // 放置按钮
  54. int x=10,y=100; // 设置按钮的初始位置
  55. for (int i=0;i<keysValue.length;i++) { // 遍历按钮数组
  56. keys[i]=new JButton(); // 创建一个新的按钮对象
  57. keys[i].setText(keysValue[i]); // 设置按钮的文本为对应的数字或运算符
  58. keys[i].setActionCommand(actionCmd[i]); // 设置按钮的动作命令标识为对应的动作命令
  59. keys[i].setBounds(x,y,60,45); // 设置按钮的位置和大小
  60. keys[i].setFont(font); // 设置按钮的字体样式
  61. if(x<=130) { // 如果按钮的横坐标小于等于130
  62. x+=60; // 向右移动60个像素,为下一个按钮的横坐标位置
  63. } else { // 如果按钮的横坐标大于130
  64. x=10; // 横坐标重置为10
  65. y+=50; // 纵坐标向下移动50个像素,为下一行按钮的纵坐标位置
  66. }
  67. this.add(keys[i]); // 将按钮添加到窗口中
  68. }
  69. // 给每个按钮添加监听
  70. for (int i=0;i<keysValue.length;i++) { // 遍历按钮数组
  71. keys[i].addActionListener(this); // 为每个按钮添加动作监听器,this表示当前窗口对象
  72. }
  73. this.setResizable(false);// 窗口大小不能修改
  74. this.setSize(270, 350);// 设置窗口大小
  75. this.setLocationRelativeTo(null);//设置窗口的相对位置,位于屏幕中央
  76. this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置窗口的关闭操作:直接关闭
  77. this.setVisible(true); // 设置窗口可见
  78. this.setFocusable(true); // 设置窗口获得焦点
  79. // 为粘贴按钮添加监听器
  80. pasteButton.addActionListener(new ActionListener() {// 当粘贴按钮被点击时,执行以下操作
  81. public void actionPerformed(ActionEvent e) {
  82. String clipboardContent = getClipboardContent(); // 获取剪贴板的内容
  83. if (clipboardContent != null) {
  84. expText.setText(clipboardContent);// 如果剪贴板的内容不为空,则将内容设置到计算式文本框中
  85. }
  86. }
  87. });
  88. // 添加键盘事件监听器,捕获键盘输入
  89. this.addKeyListener(new KeyAdapter() {
  90. StringBuilder keyBuffer = new StringBuilder();
  91. @Override
  92. public void keyTyped(KeyEvent e) {
  93. char keyChar = e.getKeyChar();// 获取键盘输入的字符
  94. String input = String.valueOf(keyChar);// 将字符转换为字符串
  95. if (Pattern.matches("[0-9.]", input)) { // 如果输入是数字或小数点
  96. keyBuffer.append(input);// 将输入追加到键盘输入缓冲区
  97. updateExpText();// 更新计算式文本框内容
  98. } else if (Pattern.matches("[+\\-*/=]", input)) {// 如果输入是运算符或等号
  99. handleOperatorOrEqualInput(input);// 处理运算符或等号输入
  100. }
  101. }
  102. private void updateExpText() {
  103. if (fh.isEmpty()) {// 如果运算符为空
  104. num1 = keyBuffer.toString();// 获取键盘输入缓冲区的内容作为第一个操作数
  105. expText.setText(num1);// 在计算式文本框中显示第一个操作数
  106. } else {// 如果运算符不为空
  107. num2 = keyBuffer.toString(); // 获取键盘输入缓冲区的内容作为第二个操作数
  108. expText.setText(num1 + fh + num2); // 在计算式文本框中显示完整的计算式(第一个操作数、运算符和第二个操作数)
  109. }
  110. }
  111. private void handleOperatorOrEqualInput(String input) {
  112. if (input.equals("=")) {// 如果输入是等号
  113. if (!fh.isEmpty() && !num2.isEmpty()) {// 如果运算符和第二个操作数都不为空
  114. result(fh); // 调用result函数计算结果
  115. }
  116. } else {// 如果输入是运算符
  117. if (!fh.isEmpty()) {// 如果运算符不为空
  118. result(fh);// 调用result函数计算结果
  119. }
  120. fh = input;// 设置当前运算符
  121. expText.setText(num1 + fh);// 在计算式文本框中显示第一个操作数和当前运算符
  122. }
  123. keyBuffer.setLength(0);// 清空键盘输入缓冲区
  124. }
  125. });
  126. }
  127. // 粘贴功能
  128. private String getClipboardContent() {
  129. Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); // 获取系统剪贴板
  130. Transferable contents = clipboard.getContents(null); // 获取剪贴板的内容
  131. if (contents != null && contents.isDataFlavorSupported(DataFlavor.stringFlavor)) {
  132. try {
  133. return (String) contents.getTransferData(DataFlavor.stringFlavor); // 尝试获取剪贴板内容并转换为字符串类型
  134. } catch (UnsupportedFlavorException | IOException e) {// 捕获不支持的数据类型和输入输出异常
  135. ((Throwable) e).printStackTrace(); // 打印异常堆栈跟踪
  136. }
  137. }
  138. return null;// 如果剪贴板内容为空或不支持字符串类型,则返回空
  139. }
  140. // 计算
  141. public void result(String z) {
  142. BigDecimal a= new BigDecimal( num1); // 创建大数对象a,使用操作数1的值作为参数
  143. BigDecimal b= new BigDecimal( num2); // 创建大数对象b,使用操作数2的值作为参数
  144. if(z.equals("+")) // 如果运算符是加号
  145. r=a.add(b); // 执行加法运算
  146. if(z.equals("-")) // 如果运算符是减号
  147. r=a.subtract(b); // 执行减法运算
  148. if(z.equals("*")) // 如果运算符是乘号
  149. r=a.multiply(b); // 执行乘法运算
  150. if(z.equals("/")) // 如果运算符是除号
  151. r=a.divide(b); // 执行除法运算
  152. num1=r.toString(); // 将计算结果转换为字符串并存储为操作数1
  153. resultText.setText(num1);// 将结果显示在文本框resultText中
  154. // 算完后将 数2 和 运算符 清空
  155. num2="";
  156. fh="";
  157. }
  158. public void actionPerformed(ActionEvent e)throws IndexOutOfBoundsException{
  159. //e.getActionCommand()得到的是组件对象上的字符串
  160. String cmd=e.getActionCommand(); // 获取事件的动作命令字符串
  161. // 处理数字和小数点按钮的点击
  162. if(cmd.equals("0")||cmd.equals("1")||cmd.equals("2")||cmd.equals("3")
  163. ||cmd.equals("4")||cmd.equals("5")||cmd.equals("6")
  164. ||cmd.equals("7")||cmd.equals("8")||cmd.equals("9")||cmd.equals(".")) {
  165. if(fh.equals("")) { // 如果运算符为空
  166. num1+=cmd; // 将按钮的字符串追加到操作数1
  167. expText.setText(num1); // 在计算式文本框中显示操作数1
  168. }
  169. else { // 如果运算符不为空
  170. num2+=cmd; // 将按钮的字符串追加到操作数2
  171. expText.setText(num1+fh+num2); // 在计算式文本框中显示完整的计算式(操作数1、运算符和操作数2)
  172. }
  173. }
  174. // 运算
  175. if(cmd.equals("+")) { // 如果点击的是加号按钮
  176. if(fh!="") // 如果运算符不为空
  177. result(fh); // 调用result函数计算结果,并将结果显示在文本框resultText中
  178. fh="+"; // 设置运算符为加号
  179. expText.setText(num1+fh); // 在计算式文本框中显示操作数1和运算符
  180. }
  181. if(cmd.equals("-")) { // 如果点击的是减号按钮
  182. if(fh!="") // 如果运算符不为空
  183. result(fh); // 调用result函数计算结果
  184. fh="-"; // 设置运算符为减号
  185. expText.setText(num1+fh); // 在计算式文本框中显示操作数1和运算符
  186. }
  187. if(cmd.equals("*")) { // 如果点击的是乘号按钮
  188. if(fh!="") // 如果运算符不为空
  189. result(fh); // 调用result函数计算结果
  190. fh="*"; // 设置运算符为乘号
  191. expText.setText(num1+fh); // 在计算式文本框中显示操作数1和运算符
  192. }
  193. if(cmd.equals("/")) { // 如果点击的是除号按钮
  194. if(fh!="") // 如果运算符不为空
  195. result(fh); // 调用result函数计算结果
  196. fh="/"; // 设置运算符为除号
  197. expText.setText(num1+fh); // 在计算式文本框中显示操作数1和运算符
  198. }
  199. if(cmd.equals("=")) { // 如果点击的是等号按钮
  200. result(fh); // 调用result函数计算结果
  201. }
  202. }
  203. public static void main(String[] args) {
  204. new Calculator();// 创建一个计算器对象并显示计算器应用程序的主窗口
  205. }
  206. }

六、界面预览

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/275867
推荐阅读
相关标签
  

闽ICP备14008679号