第2章 设计思路与算法
2.1 应用的基本工作流程
1.打开命令提示符和记事本; 2.输入源程序代码; 3.保存并运行源程序; 4.运行,检查是否有误; 5.修改错误并再次运行; 6.测试计算器的工作状况。 2.2 类设计
本次计算器的设计,主要用到的是GUI编程的相关方法。所以我们所用到的类和方法主要有:
主类:Calculation类
继承的父类为WindowAdapter类,实现了ActionListener接口,定义了一个窗体f和多个面板,按钮和文本框。
(1)方法名:display方法 作用:构建计算器的主界面
在方法display中,定义了窗体的标题,设置了窗体的大小并通过setVisible(true)方法使窗体可见,setBackground()方法设置背景颜色,setResizable(false)方法使窗体大小不可变。用setLayout()方法给容器指定按BorderLayout布局排列部件:
通过容器的add()方法将面板放置在North区域:f.add(p5,BorderLayout.NORTH),通过add方法用来向面板中加入部件。
添加GUI部件并给各个部件各自不同的标识,创建中间面板时,如面板p1,p1=new Panel(new GridLayout(1,3,5,5)),设置为GridLayout布局,再用add方法把按钮都加进去,按(1,3,5,5)方式排列
通过按钮对象的addActionListener方法为其注册事件监听处理者。 (2)方法名:actionPerformed方法
作用:设置各个GUI部件的事件处理
在 actionPerformed方法中,分别设置了不同按钮的操作事件,当不同按钮单击发生动作时自动调用执行相应的动作,从而实现计算器的多种运算功能。
通过e.getActionCommand()获得按钮事件对象的命令名,再在if语句中根据操作命令符按情况分别处理事件,进行相应运算。通过setText()方法将结果转化为数字串写入文本输入框中。
事件监听器中的事件处理方法void actionPerformed(ActionEvent e)完成主要的按钮事件的处理。事件处理分以下几种情况:数字按钮事件(“0”,“1”,“2”,“3”···“8”,“9”),小数点按钮事件(“.”),运算符按钮处理事件(“+”,“-”,“*”,“/”),正负号按钮事件(“+/-”),退格按钮事件(“Backspace”),清除按钮事件(“C”),等号按钮事件(“=”),存储按钮事件(“MS”,“MC”,“MR” ,“M+”)等。
(3)方法名:main方法
在该方法中,通过new运算符创建一个类Calculation的对象Cal,通过调用display()方法。
- 2 -
(4)方法名:windowClosing方法
在该方法中,在处理窗体的“关闭”事件的监听者采用继承WindowsAdapter的方式。
2.3 应用界面的设计
参考了windows计算器的布局,我们把总体界面采用BorderLayout布局,文本框所在的面板p5位于最上方(North区域),存储按钮及显示M状态文本框所在的面板p3在最左边(West区域),而Backspace,CE,C所在的面板p1和数字按钮、运算符按钮等所在面板p2放置在面板p4中,面板p4统一分布在中央(Center区域),同时面板中又按GridLayout布局分布多行多列。具体如下图所示。
2.4 事件处理原理、具体设计
首先,对计算器的整体布局构思清楚,将整个计算器分成多行多列组成的单元,使得整个计算器的布局更加合理、有序。采用网格块布局,整体分为6行,第一行为输入及显示框,第二行为退格键和清零键,下面几行分别为数字按钮与运算符按钮,以及MC,MR,MS,M+等存储按钮。
第二,设计依次添加GUI部件。
第三,为各个部件注册监听者,考虑到数字键,运算符,等于,小数点,求平方根等的不同以及程序的调理清晰,我们分别为其设置了不同的监听者。
第四,设置相应的各类算法。
第五,设置主程序和退出方法。
在编写完源程序代码后,进行运行,发现错误并更正。 最后,测试制作的计算器运行状况即计算能力。
- 3 -
动作事件的各方关系,结合代码大致如下图所示:
2.5 算法考虑
在 actionPerformed方法中,分别设置了不同按钮的操作事件,当不同按钮单击发生动作时自动调用执行相应的动作,从而实现计算器的多种运算功能。
数字按钮与其他按钮作为事件源都注册了监听者,且监听者符合ActionListener接口的要求。数据与运算符的键入通过点击按钮来触发事件,在按下“=”按钮时通过调用之前按下的相应运算符所表示的运算函数进行运算,将所的结果保存在dResult中,并显示在文本框内。求平方根、求倒数等运算时,调用了Math类的方法进行运算。当输入小数时,将小数点拼接到数字串中。按下清除按钮时,变量初始化。
- 4 -
第3章 源程序代码
//用JAVA编写简易计算器的程序(模拟Windows计算器) import java.awt.*;
import java.awt.event.*;
public class Calculation extends WindowAdapter implements ActionListener {
double dResult=0; double dNowInput=0;
double dMemory; //记载内存中存储的数据 int n=0; //记载小数位数
int nOperation=1; // 记录运算符类型 int nBitsNum=0; //记录总共输入的位数
boolean alreadyHaveDot=false; //是否已经有小数点 boolean keyAvailable=true;
boolean alreadyClickedEqueal=false; //是否已经按下过\按钮
boolean isTempNowInput=false; //是否在计算出结果后直接按运算符将结果赋给了当前输入值
Frame f;
Panel p1,p2,p3,p4,p5,p6; TextField tf1,tf2;
Button b1,b2,b3,b4,b5,b6,b7,b8,b9,b0;
Button bDiv,bSqrt,bMulti,bMinus,bPercent,bPlus,bReciprocal,bEqual,bDot,bNegative; Button bBackspace,bCE,bC,bMR,bMS,bMC,bM;
public void display() {
f=new Frame(\计算器\ f.setSize(280,213); f.setLocation(200,200);
f.setBackground(Color.LIGHT_GRAY); f.setResizable(false);
f.setLayout(new BorderLayout(3,3)); //采用方位布局排列部件
p1=new Panel(new GridLayout(1,3,5,5)); //用于存放Backspace,CE,C三键 p2=new Panel(new GridLayout(4,5,5,5)); //用于存放数字区及附近共20键
p3=new Panel(new GridLayout(5,1,5,5)); //用于存放MC,MR,MS,M+键及显示M状态文本框
p4=new Panel(new FlowLayout()); //用于存放p1,p2 p5=new Panel(new FlowLayout()); p6=new Panel(new FlowLayout()); p4.add(p1);
- 5 -
p4.add(p2);
tf1=new TextField(35); //存放显示区 tf1.setText(\
tf1.setEditable(false); //判断输入框是否可编辑,非编辑状态不能输入数据 p5.add(tf1);
f.add(p5,BorderLayout.NORTH); f.add(p4,BorderLayout.CENTER); f.add(p3,BorderLayout.WEST);
b1=new Button(\ //数字按钮 b2=new Button(\ b3=new Button(\ b4=new Button(\ b5=new Button(\ b6=new Button(\ b7=new Button(\ b8=new Button(\ b9=new Button(\ b0=new Button(\
b1.addActionListener(this); b2.addActionListener(this); b3.addActionListener(this); b4.addActionListener(this); b5.addActionListener(this); b6.addActionListener(this); b7.addActionListener(this); b8.addActionListener(this); b9.addActionListener(this); b0.addActionListener(this);
bDiv=new Button(\ //运算符按钮 bSqrt=new Button(\ bMulti=new Button(\ bMinus=new Button(\ bPercent=new Button(\ bPlus=new Button(\
bReciprocal=new Button(\ bEqual=new Button(\ bDot=new Button(\
bNegative=new Button(\
bDiv.addActionListener(this);
- 6 -