目录

一.界面设计

二.功能设计

三.代码实现

四.注意事项


一.界面设计

设计计算器界面时,首先需要建立一个Frame容器,作为显示窗口,之后的界面设计即围绕在该显示窗口中添加功能组件来进行后续操作。

在显示窗口上,可将该界面分为两部分,第一部分即为最上方的文本域组件,用于显示要进行计算的式子,所有的计算式与最终结果均在此文本域中显示。第二部分即为下方的按钮组件,在实现下方的按钮组件,设计思路为,新建若干个Panel容器,将其设置为FlowLayout分布式,以行为单位添加每一行的按钮组件,最后采用Box容器,向其添加之前新建的Panel容器,由于Frame容器默认为BorderLayout分布方式,将文本域组件放置于NORTH,将按钮组件放置于CENTER,之后调整Frame容器的可见性以及大小参数,此时即完成了计算器的界面设计,得到效果图如下:

二.功能设计

在计算器的功能设计中,分为输入过程功能设计与计算过程功能设计。

第一步,输入过程功能设计。该过程主要实现在点击按钮后,在文本域组件中显示点击的按钮内容,以此构成要计算的算式。在这过程中要注意,不能连续出现两个运算符,否则为错误的算式。

此过程采用的实现方式为采用自定义事件监听器的方式,分别对数字按钮和运算符按钮设计自定义事件监听器。

//定义数字按钮的事件监听器类
class myListener_01 implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {ta.append(e.getActionCommand());}}
//定义运算符的事件监听器类
/*1.不能多个运算符相连,否则则不显示后添加的运算符2.除号后不能只写0,若除号后只写0,再输入运算符时,会将0删除
*/
class myListener_02 implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {String str = ta.getText();String chs = String.valueOf(str.charAt(str.length() - 1));String ch = String.valueOf(str.charAt(str.length()-2));if(chs.equals("/") || chs.equals("-") || chs.equals("*") || chs.equals("+"));else if(chs.equals("0") && ch.equals("/")){StringBuilder sb = new StringBuilder(str);sb.delete(str.length()-1,str.length());ta.setText(sb.toString());}else{ta.append(e.getActionCommand());}}}

第二步,计算过程功能设计。通过输入过程的功能设计可以保证输入的算式符合运算规则,在计算过程功能设计中,主要针对在用户点击“=”后按照运算规则进行计算,得出正确结果。

在此过程中采用的方法为,首先取到文本域中此时的算式内容,由于此内容为String类型无法进行直接运算,所以应将其中的数字和算术符进行分离,转化为正确的格式,此处采取遍历的方式进行初步筛选,以此就实现了文本域组件中的内容提取。

/*此方法需要传入取得的文本域内容,一个用于存储数字的数组,一个用于存储运算符的数组
*/
public void Traverse(String str,ArrayList<Double> arr,ArrayList<String> chs){StringBuilder sb = new StringBuilder();for(int i=0;i<str.length();++i){String ch = String.valueOf(str.charAt(i));if(ch.equals("/") || ch.equals("*") || ch.equals("+") || ch.equals("-") || ch.equals("=")){arr.add(Double.valueOf(sb.toString()));chs.add(ch);sb.setLength(0);continue;}else{sb.append(ch);}}}

之后按照运算规则,为“=”号添加事件监听器,按照上文进行内容提取后,建立运算符在数组中对应的下标与其左右的数字在数组中下标的对应关系,按照先乘除,后加减的顺序进行计算,最终得出运算结果,并显示在文本域中,以此完成此次运算。

b44.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {ta.append(e.getActionCommand());ArrayList<Double> arr = new ArrayList<Double>();ArrayList<String> chs = new ArrayList<String>();Traverse(ta.getText(),arr,chs);Double[] d = new Double[arr.size()];String[] s = new String[chs.size()];
//                System.out.println(arr);
//                System.out.println(chs);boolean flag = true;for(int i=0;i<arr.size();++i){d[i] = arr.get(i);}for(int i=0;i<chs.size();++i){s[i] = chs.get(i);}for(int i=0;i < s.length;++i){if(s[i].equals("*")){d[i] = d[i] * d[i+1];sort(d,i+1);sort(s,i);}if(s[i].equals("/") && d[i+1] != 0){d[i] = d[i] / d[i+1];sort(d,i+1);sort(s,i);}else if (s[i].equals("/") && d[i+1] == 0){ta.setText("非法输入");flag = false;}}for(int i=0;i < s.length;++i){if(s[i].equals("+")){d[i] = d[i] + d[i+1];sort(d,i+1);sort(s,i);}if(s[i].equals("-")){d[i] = d[i] - d[i+1];sort(d,i+1);sort(s,i);}}if(flag) {BigDecimal bd = new BigDecimal(d[0]);bd = bd.setScale(2, RoundingMode.HALF_UP);ta.append(bd.toString());}}});

三.代码实现

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;public class Counter {//定义一个Window窗口Frame frame = new Frame("计算器");//组装界面public void Init(){//创建计算器的按键Panel p1 = new Panel(new FlowLayout(FlowLayout.LEFT,40,10));Button b11 = new Button("C");Button b12 = new Button("/");Button b13 = new Button("*");Button b14 = new Button("del");p1.add(b11);p1.add(b12);p1.add(b13);p1.add(b14);Panel p2 = new Panel(new FlowLayout(FlowLayout.LEFT,40,10));Button b21 = new Button("7");Button b22 = new Button("8");Button b23 = new Button("9");Button b24 = new Button("-");p2.add(b21);p2.add(b22);p2.add(b23);p2.add(b24);Panel p3 = new Panel(new FlowLayout(FlowLayout.LEFT,40,10));Button b31 = new Button("4");Button b32 = new Button("5");Button b33 = new Button("6");Button b34 = new Button("+");p3.add(b31);p3.add(b32);p3.add(b33);p3.add(b34);Panel p4 = new Panel(new FlowLayout(FlowLayout.LEFT,40,10));Button b41 = new Button("1");Button b42 = new Button("2");Button b43 = new Button("3");p4.add(b41);p4.add(b42);p4.add(b43);Panel p5 = new Panel(new FlowLayout(FlowLayout.LEFT,40,10));Button b51 = new Button("%");Button b52 = new Button("0");Button b53 = new Button(".");p5.add(b51);p5.add(b52);p5.add(b53);//组装按键Box vbox1 = Box.createVerticalBox();vbox1.add(p4);vbox1.add(p5);Box hbox1 = Box.createHorizontalBox();Button b44 = new Button("=");b44.setSize(25,128);hbox1.add(vbox1);hbox1.add(b44);hbox1.add(Box.createHorizontalStrut(45));Box vbox2 = Box.createVerticalBox();vbox2.add(p1);vbox2.add(p2);vbox2.add(p3);vbox2.add(hbox1);//组装计算器界面Panel panel = new Panel(new BorderLayout());TextArea ta = new TextArea(5,10);panel.add(ta,BorderLayout.NORTH);panel.add(vbox2);panel.setSize(421,521);frame.add(panel);frame.pack();frame.setLocation(200,200);frame.setResizable(false);frame.setVisible(true);//添加事件监听器frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});b11.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {ta.setText("");}});class myListener_01 implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {ta.append(e.getActionCommand());}}myListener_01 myListener_01 = new myListener_01();b21.addActionListener(myListener_01);b22.addActionListener(myListener_01);b23.addActionListener(myListener_01);b31.addActionListener(myListener_01);b32.addActionListener(myListener_01);b33.addActionListener(myListener_01);b41.addActionListener(myListener_01);b42.addActionListener(myListener_01);b43.addActionListener(myListener_01);b52.addActionListener(myListener_01);b53.addActionListener(myListener_01);b14.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {StringBuilder sb = new StringBuilder(ta.getText());sb.delete(sb.length()-1,sb.length());ta.setText(sb.toString());}});class myListener_02 implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {String str = ta.getText();String chs = String.valueOf(str.charAt(str.length() - 1));String ch = String.valueOf(str.charAt(str.length()-2));if(chs.equals("/") || chs.equals("-") || chs.equals("*") || chs.equals("+"));else if(chs.equals("0") && ch.equals("/")){StringBuilder sb = new StringBuilder(str);sb.delete(str.length()-1,str.length());ta.setText(sb.toString());}else{ta.append(e.getActionCommand());}}}myListener_02 myListener_02 = new myListener_02();b12.addActionListener(myListener_02);b13.addActionListener(myListener_02);b24.addActionListener(myListener_02);b34.addActionListener(myListener_02);b44.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {ta.append(e.getActionCommand());ArrayList<Double> arr = new ArrayList<Double>();ArrayList<String> chs = new ArrayList<String>();Traverse(ta.getText(),arr,chs);Double[] d = new Double[arr.size()];String[] s = new String[chs.size()];
//                System.out.println(arr);
//                System.out.println(chs);boolean flag = true;for(int i=0;i<arr.size();++i){d[i] = arr.get(i);}for(int i=0;i<chs.size();++i){s[i] = chs.get(i);}for(int i=0;i < s.length;++i){if(s[i].equals("*")){d[i] = d[i] * d[i+1];sort(d,i+1);sort(s,i);}if(s[i].equals("/") && d[i+1] != 0){d[i] = d[i] / d[i+1];sort(d,i+1);sort(s,i);}else if (s[i].equals("/") && d[i+1] == 0){ta.setText("非法输入");flag = false;}}for(int i=0;i < s.length;++i){if(s[i].equals("+")){d[i] = d[i] + d[i+1];sort(d,i+1);sort(s,i);}if(s[i].equals("-")){d[i] = d[i] - d[i+1];sort(d,i+1);sort(s,i);}}if(flag) {BigDecimal bd = new BigDecimal(d[0]);bd = bd.setScale(2, RoundingMode.HALF_UP);ta.append(bd.toString());}}});}public  void sort(Object[] arr,int pos){for(int j=pos;j<arr.length-1;++j){arr[j] = arr[j+1];}}public void Traverse(String str,ArrayList<Double> arr,ArrayList<String> chs){StringBuilder sb = new StringBuilder();for(int i=0;i<str.length();++i){String ch = String.valueOf(str.charAt(i));if(ch.equals("/") || ch.equals("*") || ch.equals("+") || ch.equals("-") || ch.equals("=")){arr.add(Double.valueOf(sb.toString()));chs.add(ch);sb.setLength(0);continue;}else{sb.append(ch);}}}public static void main(String[] args) {new Counter().Init();}
}

四.注意事项

由于编译器译码方式的不同,再不加修改的情况下运行上述代码,最后的界面中按钮部分内容无法正常显示,若想正常显示内容,可按照下图修改:(采用IDEA演示)

在完成上述修改后,再运行程序,即可正常显示。

可能存在思虑不周的情况,若有更好的实现方式,欢迎斧正!

共同进步!

GUI:简易计算器设计相关推荐

  1. 利用Swing和GUI的相关知识,设计并编程实现一个GUI简易计算器

    利用Swing和GUI的相关知识,设计并编程实现一个GUI简易计算器 要求: (1)至少实现"+"."-"."*"."/" ...

  2. C++ Qt学习笔记 (1) 简易计算器设计

    最近开始学习c++ qt, 按照教材上的例程设计一个简易的桌面计算器: Qt是一个基于C++语言的跨平台应用程序和UI开发框架,主要包含一个类库,和跨平台开发及国际化的工具,最初由挪威的Trollte ...

  3. 单片机编程简易计算机的设计,简易计算器设计

    <简易计算器设计>由会员分享,可在线阅读,更多相关<简易计算器设计(25页珍藏版)>请在人人文库网上搜索. 1.广东海洋大学寸金学院单片机课程设计论文题目: 简易计算器设计系 ...

  4. 51单片机的简易计算器设计(仿真+程序+原理图+PCB+设计报告)

    本设计: 基于51单片机的简易计算器设计(仿真+程序+原理图+PCB+设计报告) 仿真:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 编号S0001 芯片可以替换为 ...

  5. 【C51单片机】简易计算器设计(仿真)

    1.功能描述 设计一个简易计算器,模拟常见计算器的加减乘除运算功能,通过1602液晶屏来显示数字.4*4的矩阵按键来模拟计算机的按键, 2.PROTEUS中设计的电路图 3.源代码 #include ...

  6. C++ Qt学习笔记(2)简易计算器设计(为计算器添加菜单功能)

    Qt中的主窗口为建立桌面应用程序的用户提供了一个框架,Qt中提供了QMainWindow和一些相关的类共同完成主窗口的管理.Qt中的QWidget是一个最基本的窗口控件,只有一个最基本的窗口,其余什么 ...

  7. 51单片机 Proteus仿真 简易计算器设计 清零 十以内

    1 利用键盘及数码管作为计算机的输入及显示模块 2 能进行10以内的减减乘除的基本运算,按键有0~9±*/= 3 有清零"CR"按键 4 有记忆功能键 M+ RM M-,可以保存. ...

  8. c语言课程设计之简易计算器,简易计算器课程设计 帮忙写简单计算器课程设计...

    帮忙写简单计算器课程设计书繁华若真如一梦,过而无痕多好,人就不必失意,只当醉了一场,醒来仍过平淡的生活. 程序 #include #include //定义atlf函数 #include 简介下的 要 ...

  9. python制作图形化小游戏_创意编程|Python的GUI简易界面设计测测你的反应力

    Python的GUI简易界面设计案例 测测你的反应力      作为初次接触代码编程的你,是不是觉得Python程序除了"码"就是"字"即使是有趣的程序除了烧烧 ...

最新文章

  1. LATEX 在section层级目录上也加上虚线
  2. codeforces193B
  3. Android NDK开发method GetStringUTFChars’could not be resolved
  4. JZOJ 4910. 【NOIP2017模拟12.3】子串
  5. mysql 按月统计 包括空月_mysql 按月统计但是有几个月没有数据,需要变成0
  6. js常用reduce方法
  7. 详谈P(查准率),R(查全率),F1值
  8. linux rm 某个时间以前,(转)linux的一个find命令配合rm删除某天前的文件
  9. 腾讯云存储上传图片前端处理
  10. Unreal engine 4 C++ 一些调试用的绘制函数
  11. 【Kafka】Kafka InvalidReceiveException: Invalid receive (size = 369296128 larger than 104857600)
  12. 一个ip对应多个域名多个ssl证书配置-Nginx实现多域名证书HTTPS
  13. JavaSE_坚持读源码_HashSet对象_Java1.7
  14. 接口测试工具SoapUI(一)安装和破解
  15. 四叶草关闭啰嗦模式_利用OCC配置器关闭开机跑代码(啰嗦模式)教程
  16. Linux下kafka之C/C++客户端库librdkafka的编译,安装以及函数介绍
  17. spss标准差与标准偏差不一样
  18. 初中几何知识复习,已知直角三角形角度和邻边长求对边长
  19. C#实现百度翻译API调用
  20. Lee滤波和Refine-Lee滤波

热门文章

  1. 微信小程序之点击图片滑动到相应内容
  2. 大数据时代信息轰炸来袭 购房四大黄金法则
  3. 计算机cpu风扇关闭,cpu风扇怎么关闭
  4. 微信小程序 手写签名_微信小程序实现电子签名功能
  5. No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing instanc
  6. vue二维码生成可自定义logo
  7. 当前数据中心运维管理工作中存在的问题
  8. 各种二极管的区别(TVS管/瞬态电压抑制二极管/稳压二极管/普通硅二极管/肖特基二极管/快恢复二极管/应用电路)
  9. bzoj 1491: [NOI2007]社交网络
  10. 字体的报警 Font shape `TU/ptm/m/n‘ undefined(Font) using `TU/lmr/m/n‘ instead