使用Java开发的简易计算器,包括加、减、乘、除、平方、立方、小数等运算,适合学习GUI编程实践,
之前在博客上和大家分享了一篇关于使用C#开发winform计算器的文章“C#还能这么玩?[“诺基亚大屏独显计算器”来咯!”,所以最近在用Java做GUI编程的时候就想着使用Java也实现一个类似的项目。
其实在GUI交互上,Java的计算器和C#开发的计算器思想类似,都是使用函数的形式实现各模块的功能的。但同时毕竟是两种不同的开发语言,所以在具体开发上还是有所不同的。
使用Java和C#开发交互界面,最大的区别就是:
C#的交互界面的实现是可以在设计模块中直接添加控件并设置其属性,同时还会生成与控件所绑定的控件函数的,
而Java则不同,Java的窗体和控件都需要使用代码来设置的,包括控件尺寸、字体、颜色、位置坐标等都是根据特定的函数来写出来的,同时Java中的控件在最开始的时候是没有函数与其绑定的,这就需要我们根据开发需求,为控件设定相应的监听函数。
这些了解过之后,接下来就是Java计算器开发的模块化设计了。
在这里我们需要首先定义私有的全局变量来接收在计算器运行过程中的一些变量,如输入的数值、小数点、操作符、输出框内容、计算结果等,因此对于在计算器使用过程中可能出现的变量要对其进行一一接收。在这里我们使用setOutput表示文本框第一行输出的内容,使用setOutput2表示文本框第二行输出的内容。
private static String setOutput = ""; //定义文本框输出第一行
private static String setOutput2 = ""; //定义文本框输出第二行
private static double INumFirst = 0.0; //获取第一次输入的数值
private static double INumSecond = 0.0; //获取第二次输入的数值
private static double IResult = 0.0; //定义结果
private static String Operation = ""; //定义操作符
private static boolean OperationCliked = false; //定义布尔类型判断操作符是否单击
private static boolean DotCliked = false; //定义布尔类型判断小数点是否单击
private static double lastPrecisionNum = 1; //定义小数点最后一位的精度为1
private static double ControlNum = 0; //获取当前控件的数值
同时在进行程序开发前,我们就应该先对项目的整个架构进行设计,考虑到程序在开发过程中需要哪些函数、实现哪些功能、需要用到怎样的方法等。
就比如拿今天开发的这个计算器来说,我们需要有最基本的主函数,控件触发时的集中处理函数(因为我们不可能对计算器上的每一个控件设置一个处理函数,这样会增大程序的复杂度)、操作符触发时的处理函数、实现计算器界面布局的函数。同时还应该对计算器的整个界面布局进行设计,这是大灰狼在这个程序中设计的计算器界面,可以参考:
在我们有了这样的总体设计之后,就是我们针对于各个函数功能的详细设计了。
.
控件触发时集中处理函数
首先是定义控件触发时的集中处理函数,该函数的功能上可以根据实际情况分为两部分,第一部分是在我们没有点击运算操作符前,点击数字控件所触发的事件,也就是我们在输入一个数值时要做的事情;第二部分是我们在点击了运算操作符之后再点击数字控件时所触发的事件,按照实际情况,这时我们输入的数值应该是要计算的第二个数值。
与此同时,每一部分也需要根据是否点击小数点而分为两种操作,如果点击了小数点,则说明将要输入的数字是小数点后的,则要做相应的处理;若没有点击小数点,则说明此时输入的为整数位,应该让相应的数值乘以10。
该函数的具体实现代码如下:
//定义控件触发时集中处理函数
public static void Numbers_Cliked() {
//如果点击在运算操作符
if (OperationCliked) {
//如果点击了小数点
if (DotCliked) {
lastPrecisionNum *=0.1;
double strDotnum = ControlNum*lastPrecisionNum;
INumSecond += strDotnum;
}
else {
INumSecond = INumSecond*10 + ControlNum;
}
setOutput2 = "";
setOutput2 +=INumSecond;
//return setOutput2;
}
//如果没有点击运算操作符
else {
if (DotCliked) {
lastPrecisionNum *=0.1;
double strDotnum = ControlNum*lastPrecisionNum;
INumSecond += strDotnum;
}
else {
INumSecond = INumSecond*10 + ControlNum;
}
setOutput = "";
setOutput +=INumSecond;
//return setOutput;
}
}
.
操作符点击后数据转换赋值函数
当我们点击了运算操作符之后,说明我们的第一个数据已经输入完成了,这个时候,我们将要输入的是第二个数据,这时候我们就需要进行数据的赋值转换,因为我们最开始的时候是使用INumsecand这个变量来接收数据的,所以在点击运算操作符之后,我们需要将INumsecand的值赋给INumfirst,并将INumsecand的值赋于0,重新接收第二个数据。
你可能会问,为什么不直接使用INumfirst接收第一个数据,使用INumsecand接收第二个数据,原因是因为,当你点击数字控件时,我们无法判断你输入的数据是第一个数据还是第二个数据,我们只能将你输入的数据统一的赋值给某一个变量,在这里这个变量就是INumsecand,只有我们判断到当点击了运算操作符之后,说明我们的上一个数据已经输入完成了,这时候才需要我们将INumsecand赋值给INumfirst,来说明我们得到了第一个数据。
该函数的实现代码如下:
//定义操作符点击后数据转换赋值的函数
public static void Operation_Cliked() {
INumFirst = INumSecond; //将第一次键入的值赋给第一个数
INumSecond = 0; //将接收输入数值的变量赋值于0
DotCliked = false; //将布尔型小数点变量赋初值为:未点击
lastPrecisionNum = 1;
}
.
计算器窗口界面函数
在这两个函数完成之后,就是我们计算器的界面设计函数了,
在该函数中,我们需要对计算器的整体界面进行布局设计,同时还需要对每一个控件添加监控,当我们点击相应的控件的时候,可以触发相应的事件操作。
运算符控件
如我们点击加法按键时,需要将我们第一次输入的数据和加法运算符输出出来,并且调用操作符点击后数据转换赋值的函数,来进行数据的赋值转换。
//设置加法按键+
JButton add_bt = new JButton("+");
add_bt.setBounds(5, 110, 80, 40);
add_bt.setFont(font);
container.add(add_bt);
//添加单击监控
add_bt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
Operation = "+";
setOutput += Operation + "\n";
text.setText(setOutput); //数值和运算符输出
OperationCliked = true;
Operation_Cliked(); //调用操作符点击后数据转换赋值的函数
}
});
数字控件
当我们点击数字0-9时,说明我们正在进行数值的输入,这个时候就需要获取到相应控件上的数值,并且调用控件触发时集中处理函数,将我们键入的数字进行赋值。
以控件数字7为例,在这里我使用num_7.getText()来获取当前所点击控件的文本,其实这是比较笨的一种方法,需要对每一个控件使用该函数,还有一种方法是获取当前焦点所在的控件,并且获取其文本,对这种方法熟悉的小伙伴可以留言大灰狼一起交流。
下面是数字7控件的相应触发代码:
JButton num_7 = new JButton("7");
num_7.setBounds(5, 200, 80, 40);
num_7.setFont(font);
container.add(num_7);
num_7.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
String strNum = num_7.getText();
ControlNum = java.lang.Double.parseDouble(strNum);
Numbers_Cliked(); //调用数值控件触发集中处理函数
text.setText(setOutput + setOutput2); //文本框输出
}
});
其他数字控件与其类似。
小数点控件
当我们点击小数点的时候,说明我们输入的数据存在小数位,这个时候我们就需要对其作出相应的操作,如我们在点击运算操作符之前点击的小数点控件,则将小数点显示在文本框的第一行,表示第一个数是一个小数,如果我们是在点击运算操作符之后点击的小数点控件,则需要将小数点显示在文本框的第二行,表示我们输入的第二个数是小数。
具体实现代码如下:
//设置小数点按钮
JButton num_dot = new JButton(".");
num_dot.setBounds(175, 335, 80, 40);
num_dot.setFont(font);
container.add(num_dot);
num_dot.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void focusGained(FocusEvent arg0) {
// TODO Auto-generated method stub
if (OperationCliked) {
setOutput2 += ".";
text.setText(setOutput + setOutput2);
DotCliked = true;
}
else {
setOutput += ".";
text.setText(setOutput + setOutput2);
DotCliked = true;
}
}
});
等号控件
当我们点击等号控件的时候,说明我们的数据和运算符的输入已经完成了,接下来我们就只需要根据我们键入的运算符进行判断,并进行相应的运算即可,同时在得到结果之后,我们还应将之前定义的所有变量赋予初值,方便我们进行下次输入。
实现代码如下:
//设置等号按钮
JButton num_equ = new JButton("=");
num_equ.setBounds(260, 110, 80, 130);
num_equ.setFont(font);
container.add(num_equ);
num_equ.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
switch (Operation) {
case "+":
IResult = INumFirst + INumSecond;
break;
case "-":
IResult = INumFirst - INumSecond;
break;
case "*":
IResult = INumFirst * INumSecond;
break;
case "/":
IResult = INumFirst / INumSecond;
break;
case "X2":
IResult = INumFirst * INumFirst;
break;
case "X3":
IResult = INumFirst * INumFirst * INumFirst;
break;
default:
break;
}
if (Operation == "X2" )
{
setOutput = INumFirst + "*" + INumFirst + "\n";
String strIResult = java.lang.Double.toString(IResult);
setOutput2 = strIResult;
text.setText(setOutput + setOutput2);
}
if (Operation == "X3" )
{
setOutput = INumFirst + "*" + INumFirst + "*" + INumFirst + "\n";
String strIResult = java.lang.Double.toString(IResult);
setOutput2 = strIResult;
text.setText(setOutput + setOutput2);
}
else {
setOutput = INumFirst + " " + Operation + " " + INumSecond + "\n";
String strIResult = java.lang.Double.toString(IResult);
setOutput2 = strIResult;
text.setText(setOutput + setOutput2);
}
//计算结束,将变量赋予初值
setOutput = ""; //定义文本框输出
setOutput2 = "";
INumFirst = 0;
INumSecond = 0;
IResult = 0.0; //定义结果
Operation = ""; //定义操作符
OperationCliked = false; //定义布尔类型判断操作符是否单击
DotCliked = false; //定义布尔类型判断小数点是否单击
lastPrecisionNum = 1; //定义小数点最后一位的精度为1
ControlNum = 0; //获取当前控件的数值
}
});
清空按钮
最后一个需要设置的控件就是清空按钮,当我们点击该控件时,之前输入的所有东西都将会被清空,所有的变量都将会被赋予初值。
实现代码如下:
//设置清空按钮
JButton num_empty = new JButton("CE");
num_empty.setBounds(260, 245, 80, 130);
num_empty.setFont(font);
container.add(num_empty);
num_empty.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
setOutput = ""; //定义文本框输出
setOutput2 = "";
INumFirst = 0.0; //获取第一次输入的数值
INumSecond = 0.0; //获取第二次输入的数值
IResult = 0.0; //定义结果
Operation = ""; //定义操作符
OperationCliked = false; //定义布尔类型判断操作符是否单击
DotCliked = false; //定义布尔类型判断小数点是否单击
lastPrecisionNum = 1; //定义小数点最后一位的精度为1
ControlNum = 0; //获取当前控件的数值
text.setText("0");
}
});
在计算器的设计界面这些基本的控件操作完成之后,我们的计算器窗口界面函数就基本完成了。之后我们只需要在主方法中调用该函数即可实现Java计算器的运行,
.
主方法调用
主方法调用代码如下:
public static void main(String[] args) {
// TODO Auto-generated method stub
new Calculator_main().window("计算器");
}
实现效果:
**程序的完整源码可以在[Java简易计算器【可直接编译】]下载,
或者关注我的微信公众号“灰狼洞主”回复“Java计算器”即可获取程序完整源码!
觉得不错记得点赞关注哟!大灰狼期待与你一同进步!