### 编写简易计算器

计算器大家并不陌生，在我们使用的手机中，还是在电脑中，都提供了计算器，通过计算器可能行方便的进行数学的运算。例如，在 windows 2003 系统中提供的计算器如图 1 和图 2 所示，通过图 2 所示的计算器，不仅可以进行数学运算，而且还能进行进制转换，以及数据求和、求平均值等统计运算。

图 1 windows 2003 自带的计算器（标准型）

图 2 windows 2003 自带的计算器（科学型）

下面我们也来制作一个计算器。它可以实现数字的加、减、乘和除的混合运算。例如，首先单击“4”和“5”按钮，然后单击“*”按钮，再单击“2”按钮，最后单击“=”按钮，将显示 45*2 的运算结果 90.0，如图 3 所示。

图 3 运行结果

说明：在该计算器中，单击“CE”按钮，可以删除当前操作数；单击“C”按钮，可以将全部运算归零；单击“BackSpace(←)”按钮，可以删除一个数字。

#### 关键技术

在实现计算器时，应用的主要技术有 if 语句、Float 类的 valueOf()方法以及 String 类的 indexOf()方法、equals()方法和 substring()方法。由于 if 语句在从零开始版块中已经介绍，所以这里不进行介绍。下面重点介绍一下 Float 类的 valueOf()方法以及 String 类的 indexOf()方法、equals()方法和 substring()方法。

l Float 类的 valueOf()方法

Float 类的 valueOf()方法用于返回参数字符串所表示的 float 型值的 Float 对象，其方法原型如下：

public static Float valueOf(String s)

throws NumberFormatException

其中，参数 s 表示要转换为 float 型的字符串。

例如，将字符串“520.7”转换为 float 型可以使用下面的代码：

Float.valueOf("520.7");

l String 类的 equals()方法

String 类的 equals()方法用于判断两个字符串是否具有相同的字符和长度，其方法原型如下：

public boolean equals(Object anObject)

其中，参数 anObject 用于指定与此 String 进行比较的对象。

例如，比较字符串变量 value 的值是否等于小数点，可以使用下面的代码：

value.equals(".");

l String 类的 indexOf()方法

String 类的 indexOf()方法用于返回指定子字符串在此字符串中第一次出现处的索引，通过该方法可以判断一个字符串中是事包括指定字符，其方法原型如下：

public int indexOf(String str)

其中，参数 str 用于指定要查找的字符串。

例如，判断指定字符串中是否包括“.”字符，可以使用下面的代码：

showTextValue.indexOf(".")

说明：使用该方法，如果找不到对应的字符串，将返回-1。

l String 类的 substring()方法

String 类的 substring()方法可以获取从字符串某一索引位置开始截取，至某一索引位置结束的子串，其方法原型如下：

public String substring(int beginIndex,

int endIndex)

其中，参数 beginIndex 用于指定开始位置的索引，参数 endIndex 用于指定结束位置的索引。

例如，获取字符串变量 showTextValue 从索引 0 到索引 5 的子串，即从第 1 个字符到 5 个字符的子串，代码如下：

String showTextValue="abcdefg";

showTextValue.substring(0,5); //返回值为 abcde

#### 实现步骤

下面我们来介绍猜数字游戏的实现步骤。

（1）创建一个 Java 项目，名称为“编写简易计算器”。

（2）创建一个 JFrame 窗体，名称为 MainFrame，并将其保存在 com.wgh 包中。

（3）转到设计视图，在属性面板中，将 layout 属性设置为 FlowLayout，即采用流布局。

（4）次向窗体中添加 1 个文本框和 19 个按钮控件，并设置主要属性，如表 1 所示。

表 1 主窗体中控件的属性设置

控件名称 | 控件属性 | 关联变量
| text：0 focusable：false horizontalAlignment：right preferredSize：220×21 | showText
| text：BackSpace(←) preferredSize：110×28 | backspaButton
| text：CE preferredSize：50×28 | ceButton
| text：C preferredSize：50×28 | cButton
| text：7 preferredSize：52×28 | button7
| text：8 preferredSize：52×28 | button8
| text：9 preferredSize：52×28 | button7
| text：+ preferredSize：52×28 | addButton
| text：4 preferredSize：52×28 | button4
| text：5 preferredSize：52×28 | button5
| text：6 preferredSize：52×28 | button6
| text：- preferredSize：52×28 | subButton
| text：1 preferredSize：52×28 | button1
| text：2 preferredSize：52×28 | button2
| text：3 preferredSize：52×28 | button3
| text：* preferredSize：52×28 | mulButton
| text：0 preferredSize：52×28 | button0
| text：. preferredSize：52×28 | pointButton
| text：= preferredSize：52×28 | equalButton
| text：/ preferredSize：52×28 | divButton

（5）转到代码视图，在 public class MainFrame extends JFrame {语句的下方定义 3 个成员变量 num、operator 和 result，关键代码如下：

public class MainFrame extends JFrame { //系统生成的代码

private String num = "0";// 操作数

private String operator = "+";// 运算符

private String result = "0";// 结果

（6）编写用于处理输入 0 到 9 之间的数字及小数点的方法 setInputNumber()。在该方法中，根据输入的字符设置 num 操作数的值，主要应用 if 语句进行条件判断。setInputNumber()方法有两个参数，一个用于指定显示框的值，另一个用于指定当前按下的是哪个按钮。setInputNumber()方法的具体代码如下：

/**

* 功能：输入 0 到 9 之间的数字及小数点

*

* @param showTextValue

* @param value

* @return

*/

public void setInputNumber(String showTextValue, String value) {

if (value.equals(".")) { // 判断输入值是否为小数点

if (showTextValue.indexOf(".") < 0) { // 判断是否已经输入过小数点

num = showTextValue + value; // num 的值为显示框原有的值与输入的数字连接后的字符串

} else {

num = showTextValue; // num 的值为显示框的内容

}

} else { // 否则表示输入的数字

if (showTextValue.equals("0")) { // 判断显示框中的数字是否为 0

num = value; // num 的值为输入的数字

} else {

num = showTextValue + value; // num 的值为显示框原有的值与输入的数字连接后的字符串

}

}

}

（7）在图 4 所示的各按钮上双击鼠标左键，进入到代码视图，在该按钮的单击事件中，编写代码调用 setInputNumber()方法处理输入的数字及小数点。例如，在按钮 7 的单击事件中添加以下代码，其他的按钮依此类推。

setInputNumber(num, "7"); // 输入 7

showText.setText(num); //设置输入框显示的内容

图 4 数字及小数点按钮

（8）编写实现运算功能的方法 count()。在该方法中，首先将 String 型的操作数和结果转换为 float 型，然后将根据操作符 operator 的值进行相应的加、减、乘、除运算。count()方法的具体代码如下：

/**

* 实现运算

*/

private void count() {// 计算结果

float n = Float.valueOf(num); // 将操作数字符串转换为 float 型

float r = Float.valueOf(result); // 将结果字符串转换为 float 型

if (r == 0) {

result = num;

num = "0";

} else {

if (operator.equals("+")) { // 加法运算

r = r + n;

} else if (operator.equals("-")) { // 减法运算

r = r - n;

} else if (operator.equals("*")) { // 乘法运算

r = r * n;

} else { // 除法运算

r = r / n;

}

num = "0"; // 设置 num 的值为字符串 0

result = r + "";

}

}

（9）在“+”、“-”、“*”、“/”、“=”按钮上双击鼠标左键，进入到代码视图，在该按钮的单击事件中，编写代码调用 count()方法进行算术运算，并设置显示框的内容，另外，还需要将 num 设置为 0，将运算符设置为所单击的运算符。例如，在“+”按钮的单击事件中添加以下代码，其他的按钮依此类推。

count();// 计算结果

showText.setText(result);// 修改显示框的内容

num = "0";

operator = "+";// 设置运算符

（10）编写 backspace()方法实现退格功能，具体代码如下：

/**

* 功能：实现退格键功能

*

* @param showTextValue

* @return

*/

public String backspace(String showTextValue) {

String newValue = "0"; // 保存按退格键后显示框中显示的内容

if (!num.equals("0")) { // 判断 num 的值是否为 0

newValue = showTextValue.substring(0, showTextValue.length() - 1); //设置 newValue 的值为当前显示框的内容去掉最右侧的一个数字

if (newValue.equals("")) { // 如果显示框的内容为空

newValue = "0"; // 显示框中显示的内容为"0"

}

num = newValue; // num 的值为显示框的内容

} else { // 否则表示 num 的值为 0

newValue = result; // 显示框的内容为结果

}

return newValue; // 返回显示框的内容

}

（11）在“BackSpace(←)”按钮上双击鼠标左键，进入到代码视图，在该按钮的单击事件中，调用 backspace()方法实现退格键功能，具体代码如下：

showText.setText(backspace(showText.getText())); // 实现退格键功能

（12）在“CE”按钮上，双击鼠标左键，进入到代码视图，在该按钮的单击事件中，将显示框的内容设置为 0，并将操作数归 0，具体代码如下：

showText.setText("0"); //设置显示框的内容为 0

num = "0"; // 操作数归 0

（13）在“C”按钮上，在该按钮的单击事件中，将操作数和结果归 0，并将显示框的内容设置为 0，另外还需要将运算符设置为默认值，具体代码如下：

num = "0"; // 操作数归 0

showText.setText("0");// 设置显示框的内容为 0

result = "0"; // 结果归 0

operator = "+";// 运算符设为默认

（14）保存该文件，单击按钮，运行该程序，将显示如图 5 所示的运行结果。

图 5 默认的运行结果