疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx

上传人:b****1 文档编号:302076 上传时间:2023-04-28 格式:DOCX 页数:26 大小:139.20KB
下载 相关 举报
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第1页
第1页 / 共26页
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第2页
第2页 / 共26页
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第3页
第3页 / 共26页
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第4页
第4页 / 共26页
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第5页
第5页 / 共26页
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第6页
第6页 / 共26页
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第7页
第7页 / 共26页
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第8页
第8页 / 共26页
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第9页
第9页 / 共26页
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第10页
第10页 / 共26页
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第11页
第11页 / 共26页
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第12页
第12页 / 共26页
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第13页
第13页 / 共26页
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第14页
第14页 / 共26页
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第15页
第15页 / 共26页
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第16页
第16页 / 共26页
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第17页
第17页 / 共26页
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第18页
第18页 / 共26页
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第19页
第19页 / 共26页
疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx

《疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx》由会员分享,可在线阅读,更多相关《疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx(26页珍藏版)》请在冰点文库上搜索。

疯狂java实战演义第2章 仿Windows计算器Word文档格式.docx

❑使用符号“MC”、“MR”、“MS”、“M+”代表清除存储结果、读取存储结果、保存存储结果和累加存储结果。

❑使用“Backspace”符号代表退格。

❑使用“CE”和“C”代表清除上次计算结果和清除所有计算结果。

四则运算在程序中可以直接使用Java运算符实现,实现开方可以调用Math类的sqrt方法,倒数可以使用1来除以原始的数字。

当用户需点击“=”的时候,计算器就需要将最终的计算结果显示到文本框中。

其他的计算器功能都可以通过计算器内部的程序实现,例如使用某个字符串或者数字来保存相应的结果,如果需要计取、存储、累加或者清除结果,可以通过改变或者读取我们所保存的值来实现。

2.1.2界面说明

界面中使用的Swing组件相对简单,整个大窗口可以看作一个JFrame对象,在JFrame对象中,存放一个JPanel对象,我们需要为这个JPanel对象进行布局,将文本框(JTextField对象)与各个计算器按钮(JButton对象)添加到这个JPanel中。

在添加计算器按钮的时候,我们可以使用GridLayout布局处理器来进行网格状布局,由于各个计算器按钮都是以网格状分布在界面中的,因此使用GridLayout非常适合。

本章计算器的界面布局并不复杂,因此在这里不再详细描述。

2.2流程描述

用户打开计算器后,在没有关闭计算器之前,可以通过鼠标点击“1”到“9”数字键和点击“+”、“-”、“*”、“/”键去输入要运算结果的算术式,再通过点击“=”、“sqrt”、“1/x”等键去直接获取计算结果,除外,还可以点击“MC”、“MR”、“MS”、“M+”键去清除、读取、保存、累加计算显示框中显示的数字,还有清除上次结果、清除所有结果、退格等操作。

从图2.2中可以看出,计算器打开之后,就开始监听用户的鼠标动作,如果输入是关于计算结果或者“MC”、“MR”、“MS”、“M+”、“Backspace”、“CE”、“C”等操作指令,而且没有关闭计算器,就返回计算结果并显示,如果不是,则不计算结果。

接下来再继续等待用户的输入。

本章的计算器并没有复杂的流程,只需要简单的操作,返回计算结果等。

在实现计算器的过程中,我们需要注意的是,例如已经点击了某个数字,再点击运算符,那么程序需要记录之前选点击的数字,当用户再次点击运算符(非“=”)时,系统就需要将结果显示到文本框中。

因此在开发计算器的时候,我们需要注意用户点击的具体顺序。

图2.2计算流程

2.3建立计算器对象

实现一个计算器,我们需要建立一系列的对象来实现,例如,计算界面我们要建立一个界面类,还需要建立一个专门负责处理加、减、乘、除的基本计算类,还需要一个负责处理计算功能的业务类。

本小节中只讲解创建这三个基本的类,如果在开发的过程发现可以将一些行为或者属性放置到一个新的对象中,那么可以再建立这些对象来完成需要实现的功能或者操作。

本章主要设计四个类来完成计算器的功能,界面类(CalFrame)—主要用来显示计算器界面,功能类(CalService)—主要用于完成计算器中的逻辑功能,计算工具类(MyMath)—此类是工具类,用于处理大型数字的加减乘除,计算器类(Cal)—用于打开计算器,计算器中各个类的关系如图2.3所示,从图中可以看出,我们的界面类继承了java.swing.JFrame类,计算器类使用了界面类,界面类使用了功能类,功能类使用了MyMath工具类,下面章节将对这些计算器的相关类作详细介绍。

图2.3计算器类图

2.3.1MyMath工具类

使用float,double两种浮点基本类型来进行计算,容易损失精度,所以,我们使用一个自己定义了加,减,乘,除方法的类,此类使用BigDecimal来封装基本类型,在不损失精度的同时,也可以进行超大数字的四则运算。

为了方便调用,此类的方法全部都是静态方法,可以直接用“类名.方法名”调用,这个类包含以下方法:

❑staticdoubleadd(doublenum1,doublenum2),加法,使用来计算结果的数字是封装后的num1和num2,并返回double类型。

❑staticdoublesubtract(doublenum1,doublenum2),减法,使用来计算结果的数字是封装后的num1和num2,并返回double类型。

❑staticdoublemultiply(doublenum1,doublenum2),乘法,使用来计算结果的数字是封装后的num1和num2,并返回double类型。

❑staticdoubledivide(doublenum1,doublenum2),除法,使用来计算结果的数字是封装后的num1和num2,并返回double类型。

MyMath类提供了基础的四则运算方法,由于该类中所有的方法都是静态的,因此外界可以直接调用。

在实现MyMath的过程中需要注意的是,这几个四则运算方法,参数都是double类型的,要进行运算的话,需要将double类型转换成一个BigDecimal对象,我们可以使用以下代码来创建一个BigDecimal对象:

newBigDecimal(String.valueOf(number));

2.3.2CalService类

CalService类主要是用来处理计算器的业务逻辑,用户在操作计算器时,此类将计算结果,并且返回,并且,会记录计算器的状态(用户的上一步操作)。

包含以下方法:

❑StringcallMethod(Stringcmd,Stringtext),调用方法并返回计算结果。

❑Stringcal(Stringtext,booleanisPercent),用来计算加、减、乘、除法,并返回封装成String内型的结果。

参数text是显示框中的数字内容,boolean类型的参数isPercent代表是否有"

%"

运算,如果有,便加上去。

❑StringsetReciprocal(Stringtext),用来计算倒数,并返回封装成String内型的结果。

❑Stringsqrt(Stringtext),用来计算开方,并返回封装成String内型的结果。

❑StringsetOp(Stringcmd,Stringtext),设置操作符号。

❑StringsetNegative(Stringtext),设置正负数,当text是正数时,返回负数的数字字符串,反之,则返回正数的数字字符串。

❑StringcatNum(Stringcmd,Stringtext),连接输入的数字,每次点击数字,就把把新加的数字追加到后面,并封装成字符串返回。

❑StringbackSpace(Stringtext),删除最后一个字符,并返回结果。

❑StringmCmd(Stringcmd,Stringtext),用来实现“M+”、“MC”、“MR”、“MS”与存储有关的功能。

❑StringclearAll(),清除所有计算结果。

❑Stringclear(Stringtext),清除上次计算结果。

CalService类中的各个方法都是用于处理计算的逻辑,其中callMethod方法可以看作中一个中转的方法,根据参数中的cmd值进行分发处理,例如调用该方法时将“CE”字符串作为cmd,那么该方法就根据这个字符串再调用需要执行“CE”的方法。

如果需要做更好的程序解耦,我们可以将这些做成一个状态模式,将各个计算的方法都抽象成一个计算接口,该接口提供一个计算的方法,然后按照具体的情况,为该接口提供不同的实现,例如计算开方、计算倒数等实现,然后向callMethod传入不同的实现类,直接调用接口方法。

2.3.3CalFrame类

CalFrame类继承javax.swing.Jframe类,主要是用于计算器界面的实现,此类中,排版了计算器中各个组件的位置,为组件增加事件监听器,用来监听用户的操作,并做调用相应的方法,主要包含以下方法:

❑voidinitialize(),初始化计算器界面。

❑ActionListenergetActionListener(),如果动作监听器为空,则创建一个,并返回,如果不为空,直接返回。

❑JTextFieldgetTextField(),这个方法初始化输入框。

❑JButton[]getMButton(),此方法获得计算器的存储操作键。

❑JButton[]getRButton(),此方法获得计算器的结果操作键。

❑JButton[]getNButton(),此方法获得计算器的其它操作键。

由于CalFrame是界面类,因此所需要进行的业务处理并不多,更多的是监听用户的操作,并进行分发处理。

这就有点像web应用中的MVC模式中的V(视图),并不处理任务的业务逻辑,主要职责是显示相应的数据。

在本章中,CalFrame包括了一些监听器,监听界面事件并调用相关的业务方法,在实际开发中,我们可以将这些监听器作为MVC模式中的C(控制器)提取到另外的类中。

2.4MyMath工具类实现

MyMath是一个工具类,主要用于处理加、减、乘、除四则运算,我们已经确定了实现这四个方法的时候,都使用BigDecimal对象进行计算。

由于我们定义MyMath方法的时候,所有方法的参数都是double类刑的,因此我们可以提供一个工具方法来将double转换成BigDecimal类型。

以下代码根据一个double类型转换成一个BigDecimal。

代码清单:

code\cal\src\org\crazyit\cal\MyMath.java

/**

*为一个double类型的数字创建BigDecimal对象

*@paramnumber

*@return

*/

privatestaticBigDecimalgetBigDecimal(doublenumber){

returnnewBigDecimal(number);

}

提供了这个工具方法后,我们可以在其他的计算方法中使用这个工具方法,选择将double的参数转换成BigDecimal对象,然后再进行具体的运算。

2.4.1实现四则运算

编写了double转换的工具方法后,实现加、减、乘、除比较简单,由于BigDecimal已经为我们实现了,因此可以直接调用该类的相应方法即可实现,以下代码分别实现四则运算。

加法:

publicstaticdoubleadd(doublenum1,doublenum2){

//调用工具方法将double转换成BigDecimal

BigDecimalfirst=getBigDecimal(num1);

BigDecimalsecond=getBigDecimal(num2);

returnfirst.add(second).doubleValue();

减法:

publicstaticdoublesubtract(doublenum1,doublenum2){

returnfirst.subtract(second).doubleValue();

乘法:

publicstaticdoublemultiply(doublenum1,doublenum2){

returnfirst.multiply(second).doubleValue();

除法:

publicstaticdoubledivide(doublenum1,doublenum2){

returnfirst.divide(second,DEFAULT_SCALE,BigDecimal.ROUND_HALF_UP)

.doubleValue();

四个方法都是调用了BigDecimal的方法来实现,Java的BigDecimal类为我们提供了许多强大的计算方法,可以让我们很方便的进行数学运算,除本章介绍的方法我,读者可以查阅Java的API来学习该类的详细使用。

2.5计算器主界面

这里实现计算器的界面,是用java的Swing实现的,主要用到的类有javax.swing.JFrame(窗口),javax.swing.JButton(按钮),javax.swing.JTextField(输入框),并使用java.awt.BorderLayout和java.awt.GridLayout进行布局。

在这里,我们使用“自下而下”的方法去观察此类,先看总体的排版实现,再看各个小组件的实现。

为了方便布局,我们按相近的外观把计算器分为四个部分,见图2.4:

图2.4布局

2.5.1初始化界面(initialize()方法)

此类就是一个JFrame(继承了javax.swing.JFrame),用来做其它窗口或者组件的父容器,初始化计算器窗口的大概流程:

❑设置父窗口JFrame标题、布局管理器、是否可以改变等属性。

❑增加输入与计算结果显示框。

对应图2.4中的左上角那部分。

❑增加左边存储操作键。

❑增加结果操作键。

❑增加数字与其它运算符。

由于按外观相近的方式把组件分成了四部分,就方便程序中对相同属性的组件统一地创建与设置属性,对于界面的布局也更加地直观与方便,观察此图,我们可以使用BorderLayout做总体布局,如图2.5所示。

图2.5布局管理器

以下代码设置父窗口JFrame标题和设置是否可以改变大小的属性。

//设置窗口的标题

this.setTitle("

计算器"

);

//设置为不可改变大小

this.setResizable(false);

增加输入与结果显示的JTextField输入框,这里调用本类的getTextField()方法获取,并把它加入panel中的NORTH位置中:

//增加计算输入框

JPanelpanel=newJPanel();

panel.setLayout(newBorderLayout(10,1));

panel.add(getTextField(),BorderLayout.NORTH);

panel.setPreferredSize(newDimension(PRE_WIDTH,PRE_HEIGHT));

增加左边存储操作键,本类需要通过getMButton()方法获取一个保存JButton对象的数组,getMButton方法我们将在2.5.2中实现。

获取数组后,遍历数组,并把数组中的元素加到一个新建的JPanel中,最后再把这个JPanel加到JFrame的相应位置:

//增加左边存储操作键

JButton[]mButton=getMButton();

//新建一个panel,用于放置按钮

JPanelpanel1=newJPanel();

//设置布局管理器

panel1.setLayout(newGridLayout(5,1,0,5));

//迭代增加按钮

for(JButtonb:

mButton)panel1.add(b);

增加结果操作键,这些结果操作键包括:

Back,CE,C。

通过本类的getRButton()方法获取一个保存JButton对象的数组,获取数组后,遍历数组,并把数组中的元素加到一个新建的JPanel中,最后再把这个JPanel加到JFrame相应的位置,具体实现的代码如下:

//增加结果操作键

JButton[]rButton=getRButton();

JPanelpanel2=newJPanel();

panel2.setLayout(newBorderLayout(1,5));

//新建一个panel,用于放置按钮

JPanelpanel21=newJPanel();

//设置布局管理器

panel21.setLayout(newGridLayout(1,3,3,3));

//迭代增加按钮

for(JButtonb:

rButton)panel21.add(b);

接下来将其他的按键加入到界面的JPanel对象中,这些操作键主要包括数字键和其他的一些运算键,我们同样的通过一个getNButton方法来返回这些操作键对应的JButton对象,最后将这些JButton对象加入到相应的JPanel中,加入到JPanel并设置相应布局的代码如下:

//增加数字与其它运算符

JButton[]nButton=getNButton();

JPanelpanel22=newJPanel();

panel22.setLayout(newGridLayout(4,5,3,5));

nButton)panel22.add(b);

//把新增加的面板加到frame

this.add(panel);

在本小节中,我们通过getMButton、getRButton和getNButton方法来返回不同的JButton数组,然后再对这些数组进行遍历,将每一个JButton加入到界面中。

这一个返回JButton数组的方法并没有实现,下面将介绍如何实现这三个方法。

以上所有的代码均在code\cal\src\org\crazyit\cal\CalFrame.java中。

2.5.2创建运算键

运算键主要包括数字键与基本运算键,数字键从0到9,基本运算键包括开方、正负、小数点等键,主要实现计算器界面的getNButton方法即可。

以下是该方法的实现。

code\cal\src\org\crazyit\cal\CalFrame.java

privateJButton[]getNButton(){

//这个数组保存需要设置为红色的操作符

String[]redButton={"

/"

"

*"

-"

+"

="

};

JButton[]result=newJButton[nOp.length];

for(inti=0;

i<

this.nOp.length;

i++){

//新建按钮

JButtonb=newJButton(this.nOp[i]);

//为按钮增加事件

b.addActionListener(getActionListener());

//对redButton排序,才可以使用binarySearch方法

Arrays.sort(redButton);

//如果操作符在redButton出现

if(Arrays.binarySearch(redButton,nOp[i])>

=0){

b.setForeground(Color.red);

}else{

b.setForeground(Color.blue);

}

result[i]=b;

}

returnresult;

以上代码需要注意的是,我们需要提供一个红色按键的字符串数组,在遍历所有的需要创建的按键数组时,就需要作判断,如果按键数组里面存在红色按键数组的某个元素,就需要调用JButton的setForeground方法来设置该按钮的字体颜色。

在代码中我们不能看到该方法帮我们创建了哪些按键,代码中使用了一个nOp的字符串数组来保存需要创建的按键,该数组包含的内容如下:

privateString[]nOp={"

7"

8"

9"

sqrt"

4"

5"

6"

"

1"

2"

3"

1/x"

0"

+/-"

."

2.5.3创建操作按键

操作按键的创建与运算键的创建基本一致,只是所有的按键的字体都必须是红色的,创建操作按钮,我们需要实现getMButton和getRButton方法,以下是这两个方法的具体实现。

privateJButton[]getMButton(){

JButton[]resul

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2