Java 简易计算器
最近Java作业是设计一个简易计算器 要求是利用frame和panel设计计算器同时实现其基本的加减乘除清零等功能
代码主要分成三块
- 构造函数 主要用于生成按钮等组件以及排版
- 事件处理 不同的按钮有不同的作用
- 计算结果 编写一个函数 对输入的算式进行计算并返回结果
先附上最后的成果图
先对各段进行说明 代码在最后统一给出
1.构造函数
这块主要是对按钮各组件进行排版,用了一个Frame嵌套2个Panel的结构。
第一个Panel是一个文本显示区域,就是图中那一条白框,初始值为0。然后这里是用了TextArea,本来是打算用TextField的,但是TextField不能调节高度,总是显得很扁。于是就用了TextArea,然后把水平和竖直方向的滚动条都去了,就是图中的样子了(去掉滚动条之后就是一个可以调节长宽的TextField啊…)。
第二个Panel是按钮区,包含了0-9、+、-、x、/、.、CE、backspace、=一共18个按钮。
2.事件处理
这部分就是对于不同按钮有不同的反应。如果按的是CE,就清空文本区里的文本;如果按的的是backspace,就删去最后一个字符;如果按的是等于,就把已经输入的字符串(就是那一串数字加运算符)input作为参数,带入第三部分的计算结果的函数里计算结果并返回,同时输出结果;如果按的是数字或者运算符,就直接记录在input里就好了;然后这边因为String类型的变量不方便直接改,所以我就转换成了StringBuffer类型进行处理,不过上网搜的时候好像更推荐用StringBuilder类…不是很清楚。
3.计算结果
这一部分主要是对输入进来的input进行处理。首先找到运算符的下标,然后根据这个下表把字符串划分成三段:第一个数字、运算符、第二个数字;然后再把数字转换成浮点型进行运算最后转换回字符串型返回即可。
这里说一下indexOf这个函数,这里因为是寻找运算符的下标,如果没出现这个运算符就返回-1,如果出现了就返回下标。所以四个运算符的结果加起来再加上3就是出现的运算符的下标。
代码
/* 简易计算器 注意事项
* 一次只能对 一个 运算符进行操作 别多写了 计算不出来的
* CE清空 backspace回删
* 没有异常处理 还有各种可能出现的异常都没判断
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.Border;
public class Calculator extends Frame implements ActionListener, WindowListener
{
//主函数
public static void main(String[] args)
{
Calculator cal = new Calculator();
}
//全局变量设置
Frame fr;
Button []but;
TextArea ta;
String name[] = {"7","8","9","x","/","CE","4","5","6","+","-","backspace","1","2","3",".","0","="};
StringBuffer input = new StringBuffer();
int num1 ,num2 ,res = 0;
//构造函数 用于生成按钮以及排版 文本区的大小以及frame的大小不要随便改
public Calculator()
{
fr = new Frame("简易计算器");
Panel panela = new Panel();//文本框
ta = new TextArea("0",5,90,3);//5表示宽度 90表示长度 3表示滚动条类型 都隐藏
panela.add(ta,new BorderLayout().CENTER);
fr.add(panela,BorderLayout.NORTH);
Panel panelb = new Panel();//按钮 1 2 3 4 5 6 7 8 9 + - x / CE backspace...3x6gridlayout
panelb.setLayout(new GridLayout(3,6));
but = new Button[name.length];
for(int i = 0;i < name.length;i++)
{
but[i] = new Button(name[i]);
but[i].addActionListener(this);
panelb.add(but[i]);
}
fr.add(panelb,BorderLayout.CENTER);
fr.pack();
fr.show();
fr.setSize(700,400);
fr.addWindowListener(this);
}
//响应事件
public void actionPerformed(ActionEvent e) {
String temp;
if(e.getSource() == but[5])//若按了CE
{
input = new StringBuffer("");
ta.setText(" ");
}
else if(e.getSource() == but[11])//若按了backspace
{
input.delete(input.length()-1,input.length());
temp = input.toString();
ta.setText(temp);
}
else if(e.getSource() == but[17])//若按了=
{
temp = input.toString();
temp = calculate(temp);
temp = input+"="+temp;
ta.setText(temp);
input = new StringBuffer("");
}
else//若按了数字以及加减乘除
{
input.append(e.getActionCommand());
temp = input.toString();
ta.setText(temp);
}
}
//计算结果函数
String calculate(String str)
{
int plus = str.indexOf("+");
int minus = str.indexOf("-");
int mutiple = str.indexOf("x");
int divide = str.indexOf("/");
int ind = plus+minus+mutiple+divide+3;
String s1 = str.substring(0,ind);
String s2 = str.substring(ind+1,str.length());
float num1 = Float.parseFloat(s1);
float num2 = Float.parseFloat(s2);
float res = 0;
if(ind == plus)
res = (num1+num2);
else if(ind == minus)
res = (num1-num2);
else if(ind == mutiple)
res = (num1*num2);
else
res = num1/num2;
String s = res + "";
return s;
}
public void windowActivated(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
public void windowDeactivated(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowOpened(WindowEvent e) {}
}
不过,这个计算器一次只能进行一次运算,就是说一次只能输入一个运算符,所以叫“简易”计算器…