摘要:手把手教你使用 Java AWT 创建一个简易计算器。

本文分享自华为云社区《手把手教你使用 Java AWT 创建一个简易计算器》,作者:海拥 。

关于AWT

AWT (抽象窗口工具包)是一个有助于构建 GUI 的 API (图形用户界面)基于 java 应用程序。GUI使用一些图形帮助用户交互。它主要由一组的类和方法所必需的,如在一个简化的方式创建和管理的GUI按钮,窗口,框架,文本框,单选按钮 等等

我所提供的Java代码对于动作监听器接口用于事件处理的计算器。

逻辑部分

1.对于数字按钮

  1. if(e.getSource()==b1){ //b1 代表数字 1
  2. zt=l1.getText();
  3. z=zt+"1";// 1 将合并在前一个值的末尾
  4. l1.setText(z);
  5. }

当按下任何数字按钮时,标签 l1 中的任何值都将存储在变量 zt 中,然后与相应的数字连接,然后显示在标签 l1 中,对于 NEGATIVE 和 DECIMAL PTS 按钮,我们也做了类似的处理

2.对于算术按钮

  1. if(e.getSource()==badd){ //对应加法
  2. num1=Double.parseDouble(l1.getText());
  3. z="";
  4. l1.setText(z);
  5. check=1;
  6. }

现在,我们将标签 l1 的值转换为 double 类型后,将其存储到变量 num1 中,这在技术上将是第一个数字,然后将标签 l1 设置为 null

我们将只使用一个检查变量来获取这个特定的气动按钮(这里是 +)被点击,这样我们就可以在我们的 = 按钮中执行这个操作

3.对于等号按钮

  1. if(e.getSource()==bcalc){
  2. num2=Double.parseDouble(l1.getText());
  3. if(check==1)
  4. xd =num1+num2;
  5. if(check==2)
  6. xd =num1-num2;
  7. if(check==3)
  8. xd =num1*num2;
  9. if(check==4)
  10. xd =num1/num2;
  11. if(check==5)
  12. xd =num1%num2;
  13. l1.setText(String.valueOf(xd));
  14. }

现在再次将值存储 l1到 num2变量中,这将是算术上的第二个数字,然后检查变量的值,check然后进行相应的操作,然后在标签中显示结果 l1

4.对于清除按钮

  1. if(e.getSource()==bclr){
  2. num1=0;
  3. num2=0;
  4. check=0;
  5. xd=0;
  6. z="";
  7. l1.setText(z);
  8. }

此处将我们使用的所有变量更新为其默认值 0

并将标签 l1 设置为 null,以便我们之后可以开始新的计算

5.对于退格按钮

  1. if(e.getSource()==bback){
  2. zt=l1.getText();
  3. try{
  4. z=zt.substring(0, zt.length()-1);
  5. }catch(StringIndexOutOfBoundsException f){return;}
  6. l1.setText(z);
  7. }

这里只是l1通过使用substring函数删除最后一位数字来更新值

并处理了一个 StringIndexOutOfBoundsException 当我们在标签中的值为 null 并且仍然按下返回按钮时发生的异常

6.特殊插件功能

我所做的只是处理了 EQUAL 和所有 ARITHMETIC Buttons 中的一个异常,并根据情况打印了所需的消息

算术按钮:

  1. try{
  2. num1=Double.parseDouble(l1.getText());
  3. }catch(NumberFormatException f){
  4. l1.setText("Invalid Format");
  5. return;
  6. }

等于按钮:

  1. try{
  2. num2=Double.parseDouble(l1.getText());
  3. }catch(Exception f){
  4. l1.setText("ENTER NUMBER FIRST ");
  5. return;
  6. }

当我们将值转换为双精度值时,但可以说,标签 l1 具有空值(即标签为空)并且我们仍然按下这些按钮,然后它将生成 NumberFormatException execption,所以处理并打印所需的消息。

==例如==:

如果我点击1然后+然后我点击-而不是其他一些数字按钮,因此这是一个无效的格式,并且当-当时被点击时标签为空因此生成了execption所以只是处理它并在标签中打印无效格式

类似地,当标签为空时,并且在这种情况下单击 = ENTER NUMBER FIRST 将显示在标签内

至此,我们结束了本次 Java AWT 教程。

GIF演示

附完整代码:

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. class MyCalc extends WindowAdapter implements ActionListener{
  4. Frame f;
  5. Label l1;
  6. Button b1,b2,b3,b4,b5,b6,b7,b8,b9,b0;
  7. Button badd,bsub,bmult,bdiv,bmod,bcalc,bclr,bpts,bneg,bback;
  8. double xd;
  9. double num1,num2,check;
  10.  
  11. MyCalc(){
  12. f= new Frame("MY CALCULATOR");
  13. // 实例化组件
  14. l1=new Label();
  15. l1.setBackground(Color.LIGHT_GRAY);
  16. l1.setBounds(50,50,260,60);
  17. b1=new Button("1");
  18. b1.setBounds(50,340,50,50);
  19. b2=new Button("2");
  20. b2.setBounds(120,340,50,50);
  21. b3=new Button("3");
  22. b3.setBounds(190,340,50,50);
  23. b4=new Button("4");
  24. b4.setBounds(50,270,50,50);
  25. b5=new Button("5");
  26. b5.setBounds(120,270,50,50);
  27. b6=new Button("6");
  28. b6.setBounds(190,270,50,50);
  29. b7=new Button("7");
  30. b7.setBounds(50,200,50,50);
  31. b8=new Button("8");
  32. b8.setBounds(120,200,50,50);
  33. b9=new Button("9");
  34. b9.setBounds(190,200,50,50);
  35. b0=new Button("0");
  36. b0.setBounds(120,410,50,50);
  37. bneg=new Button("+/-");
  38. bneg.setBounds(50,410,50,50);
  39. bpts=new Button(".");
  40. bpts.setBounds(190,410,50,50);
  41. bback=new Button("back");
  42. bback.setBounds(120,130,50,50);
  43.  
  44. badd=new Button("+");
  45. badd.setBounds(260,340,50,50);
  46. bsub=new Button("-");
  47. bsub.setBounds(260,270,50,50);
  48. bmult=new Button("*");
  49. bmult.setBounds(260,200,50,50);
  50. bdiv=new Button("/");
  51. bdiv.setBounds(260,130,50,50);
  52. bmod=new Button("%");
  53. bmod.setBounds(190,130,50,50);
  54. bcalc=new Button("=");
  55. bcalc.setBounds(245,410,65,50);
  56. bclr=new Button("CE");
  57. bclr.setBounds(50,130,65,50);
  58. b1.addActionListener(this);
  59. b2.addActionListener(this);
  60. b3.addActionListener(this);
  61. b4.addActionListener(this);
  62. b5.addActionListener(this);
  63. b6.addActionListener(this);
  64. b7.addActionListener(this);
  65. b8.addActionListener(this);
  66. b9.addActionListener(this);
  67. b0.addActionListener(this);
  68.  
  69. bpts.addActionListener(this);
  70. bneg.addActionListener(this);
  71. bback.addActionListener(this);
  72.  
  73. badd.addActionListener(this);
  74. bsub.addActionListener(this);
  75. bmult.addActionListener(this);
  76. bdiv.addActionListener(this);
  77. bmod.addActionListener(this);
  78. bcalc.addActionListener(this);
  79. bclr.addActionListener(this);
  80.  
  81. f.addWindowListener(this);
  82. //添加到框架
  83. f.add(l1);
  84. f.add(b1); f.add(b2); f.add(b3); f.add(b4); f.add(b5);f.add(b6); f.add(b7); f.add(b8);f.add(b9);f.add(b0);
  85.  
  86. f.add(badd); f.add(bsub); f.add(bmod); f.add(bmult); f.add(bdiv); f.add(bmod);f.add(bcalc);
  87.  
  88. f.add(bclr); f.add(bpts);f.add(bneg); f.add(bback);
  89.  
  90. f.setSize(360,500);
  91. f.setLayout(null);
  92. f.setVisible(true);
  93. }
  94. //关闭窗口
  95. public void windowClosing(WindowEvent e) {
  96. f.dispose();
  97. }
  98.  
  99. public void actionPerformed(ActionEvent e){
  100. String z,zt;
  101. //数字按钮
  102. if(e.getSource()==b1){
  103. zt=l1.getText();
  104. z=zt+"1";
  105. l1.setText(z);
  106. }
  107. if(e.getSource()==b2){
  108. zt=l1.getText();
  109. z=zt+"2";
  110. l1.setText(z);
  111. }
  112. if(e.getSource()==b3){
  113. zt=l1.getText();
  114. z=zt+"3";
  115. l1.setText(z);
  116. }
  117. if(e.getSource()==b4){
  118. zt=l1.getText();
  119. z=zt+"4";
  120. l1.setText(z);
  121. }
  122. if(e.getSource()==b5){
  123. zt=l1.getText();
  124. z=zt+"5";
  125. l1.setText(z);
  126. }
  127. if(e.getSource()==b6){
  128. zt=l1.getText();
  129. z=zt+"6";
  130. l1.setText(z);
  131. }
  132. if(e.getSource()==b7){
  133. zt=l1.getText();
  134. z=zt+"7";
  135. l1.setText(z);
  136. }
  137. if(e.getSource()==b8){
  138. zt=l1.getText();
  139. z=zt+"8";
  140. l1.setText(z);
  141. }
  142. if(e.getSource()==b9){
  143. zt=l1.getText();
  144. z=zt+"9";
  145. l1.setText(z);
  146. }
  147. if(e.getSource()==b0){
  148. zt=l1.getText();
  149. z=zt+"0";
  150. l1.setText(z);
  151. }
  152.  
  153. if(e.getSource()==bpts){ //添加小数点
  154. zt=l1.getText();
  155. z=zt+".";
  156. l1.setText(z);
  157. }
  158. if(e.getSource()==bneg){ //对于减
  159. zt=l1.getText();
  160. z="-"+zt;
  161. l1.setText(z);
  162. }
  163.  
  164. if(e.getSource()==bback){ // 退格用
  165. zt=l1.getText();
  166. try{
  167. z=zt.substring(0, zt.length()-1);
  168. }catch(StringIndexOutOfBoundsException f){return;}
  169. l1.setText(z);
  170. }
  171. //算术按钮
  172. if(e.getSource()==badd){ //对应加法
  173. try{
  174. num1=Double.parseDouble(l1.getText());
  175. }catch(NumberFormatException f){
  176. l1.setText("Invalid Format");
  177. return;
  178. }
  179. z="";
  180. l1.setText(z);
  181. check=1;
  182. }
  183. if(e.getSource()==bsub){ //对应减法
  184. try{
  185. num1=Double.parseDouble(l1.getText());
  186. }catch(NumberFormatException f){
  187. l1.setText("Invalid Format");
  188. return;
  189. }
  190. z="";
  191. l1.setText(z);
  192. check=2;
  193. }
  194. if(e.getSource()==bmult){ //对应乘法
  195. try{
  196. num1=Double.parseDouble(l1.getText());
  197. }catch(NumberFormatException f){
  198. l1.setText("Invalid Format");
  199. return;
  200. }
  201. z="";
  202. l1.setText(z);
  203. check=3;
  204. }
  205. if(e.getSource()==bdiv){ //对应除法
  206. try{
  207. num1=Double.parseDouble(l1.getText());
  208. }catch(NumberFormatException f){
  209. l1.setText("Invalid Format");
  210. return;
  211. }
  212. z="";
  213. l1.setText(z);
  214. check=4;
  215. }
  216. if(e.getSource()==bmod){ //对应MOD/剩余
  217. try{
  218. num1=Double.parseDouble(l1.getText());
  219. }catch(NumberFormatException f){
  220. l1.setText("Invalid Format");
  221. return;
  222. }
  223. z="";
  224. l1.setText(z);
  225. check=5;
  226. }
  227. //结果按钮
  228. if(e.getSource()==bcalc){
  229. try{
  230. num2=Double.parseDouble(l1.getText());
  231. }catch(Exception f){
  232. l1.setText("ENTER NUMBER FIRST ");
  233. return;
  234. }
  235. if(check==1)
  236. xd =num1+num2;
  237. if(check==2)
  238. xd =num1-num2;
  239. if(check==3)
  240. xd =num1*num2;
  241. if(check==4)
  242. xd =num1/num2;
  243. if(check==5)
  244. xd =num1%num2;
  245. l1.setText(String.valueOf(xd));
  246. }
  247. //清除标签和内存
  248. if(e.getSource()==bclr){
  249. num1=0;
  250. num2=0;
  251. check=0;
  252. xd=0;
  253. z="";
  254. l1.setText(z);
  255. }
  256.  
  257. }
  258. //实例化 MyCalc 对象的 main 方法
  259. public static void main(String args[]){
  260. new MyCalc();
  261. }
  262. }

点击关注,第一时间了解华为云新鲜技术~

如何使用Java AWT 创建一个简易计算器的更多相关文章

  1. 依赖注入[5]: 创建一个简易版的DI框架[下篇]

    为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架.在<依赖注入[4]: 创建一个简易版的DI框架[上篇]> ...

  2. 依赖注入[4]: 创建一个简易版的DI框架[上篇]

    本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章(<控制反转>.<基于IoC的设计模式>和< 依赖注入模式>)从纯理论的角度 ...

  3. .NET CORE学习笔记系列(2)——依赖注入[4]: 创建一个简易版的DI框架[上篇]

    原文https://www.cnblogs.com/artech/p/net-core-di-04.html 本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章从 ...

  4. 使用Python创建一个简易的Web Server

    Python 2.x中自带了SimpleHTTPServer模块,到Python3.x中,该模块被合并到了http.server模块中.使用该模块,可以快速创建一个简易的Web服务器. 我们在C:\U ...

  5. 怎么在java中创建一个自定义的collector

    目录 简介 Collector介绍 自定义Collector 总结 怎么在java中创建一个自定义的collector 简介 在之前的java collectors文章里面,我们讲到了stream的c ...

  6. 前端 JavaScript 实现一个简易计算器

    前端使用 JavaScript 实现一个简易计算器,没有难度,但是里面有些小知识还是需要注意的,算是一次基础知识回顾吧. 题目 实现一个简易版的计算器,需求如下: 1.除法操作时,如果被除数为0,则结 ...

  7. java用户界面—创建一个面板

    先从基础学起 创建一个面板 代码如下: package Day08; import java.awt.FlowLayout; import javax.swing.JButton;import jav ...

  8. 制作一个简易计算器——基于Android Studio实现

    一个计算器Android程序的源码部分分为主干和细节两部分. 一.主干 1. 主干的构成 计算器的布局 事件(即计算器上的按钮.文本框)监听 实现计算 2. 详细解释 假设我们的项目名为Calcula ...

  9. 用Java语言编写一个简易画板

    讲了三篇概博客的概念,今天,我们来一点实际的东西.我们来探讨一下如何用Java语言,编写一块简易的画图板. 一.需求分析 无论我们使用什么语言,去编写一个什么样的项目,我们的第一步,总是去分析这个项目 ...

随机推荐

  1. SpringBoot自动配置的魔法

    Spring自动配置 从@SpringBootApplication注解说起 SpringBoot会根据类路径下的类自动配置,省去了编写繁琐的xml配置文件.原本基于xml配置bean的方式编程基于J ...

  2. Solution Set - Border Theory

      我发现写 Solution Set 就不用写每道题的题意了,岂不美哉?   首先是一些奇妙结论.   定理 1(弱周期定理) 对于字符串 \(S\),若 \(S[:p]\) 和 \(S[:q]\) ...

  3. 5.Flink实时项目之业务数据准备

    1. 流程介绍 在上一篇文章中,我们已经把客户端的页面日志,启动日志,曝光日志分别发送到kafka对应的主题中.在本文中,我们将把业务数据也发送到对应的kafka主题中. 通过maxwell采集业务数 ...

  4. MXNet源码分析 | Gluon接口分布式训练流程

    本文主要基于MXNet1.6.0版本,对Gluon接口的分布式训练过程进行简要分析. 众所周知,KVStore负责MXNet分布式训练过程中参数的同步,那么它究竟是如何应用在训练中的呢?下面我们将从G ...

  5. CoRR 2015 | MXNet: A Flexible and Efficient Machine Learning Library for Heterogeneous Distributed Systems

    MXNet是一个支持多种编程语言的机器学习库,使用MXNet可以方便地实现机器学习算法,尤其是深度神经网络.通过嵌入在宿主语言中,它将声明式符号表达与命令式张量计算相结合.它提供自动求导以计算梯度.M ...

  6. Spring Boot数据访问之整合Mybatis

    在Mybatis整合Spring - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中谈到了Spring和Mybatis整合需要整合的点在哪些方面,需要将Mybatis中数据库连接池等相关对 ...

  7. 如何使用IDEA工具右边栏的Database模块

    理解Spring Boot自动配置数据源相关代码进行测试时总是无法链接数据库,但是其他方式链接又是没有问题.不知道哪里出现问题了,后来搜资料无意中看到idea提供了Database模块可以测试,就是用 ...

  8. WPF/MVVM Quick Start Tutorial - WPF/MVVM 快速入门教程 -原文,翻译及一点自己的补充

    转载自 https://www.codeproject.com/articles/165368/wpf-mvvm-quick-start-tutorial WPF/MVVM Quick Start T ...

  9. 轻量级DI框架Guice使用详解

    背景 在日常写一些小工具或者小项目的时候,有依赖管理和依赖注入的需求,但是Spring(Boot)体系作为DI框架过于重量级,于是需要调研一款微型的DI框架.Guice是Google出品的一款轻量级的 ...

  10. [LeetCode]1108. IP 地址无效化

    给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本. 所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 ".". 示例 ...