计算器界面的实现在之前swing组件那节课已经完成。这一篇总结来写功能的实现。
一、添加监听器方法
下边是之前实例化的二十个按钮,包括10个数字,加(+)减(-)乘(*)除(/)乘方(x2)取余(%)
取绝对值(abs)等于(=)和清零(AC)
//实例化二十个JButton对象
JButton jba = new JButton("AC");
JButton jbb = new JButton("x2");
JButton jbc = new JButton("abs");
JButton jbd = new JButton("%");
JButton jbe = new JButton("1");
JButton jbf = new JButton("2");
JButton jbg = new JButton("3");
JButton jbh = new JButton("+");
jbh.setFont(new Font("",0,20));
JButton jbi = new JButton("4");
JButton jbj = new JButton("5");
JButton jbk = new JButton("6");
JButton jbl = new JButton("-");
jbl.setFont(new Font("",0,30));
JButton jbm = new JButton("7");
JButton jbn = new JButton("8");
JButton jbo = new JButton("9");
JButton jbp = new JButton("*");
jbp.setFont(new Font("",0,20));
JButton jbq = new JButton("0");
JButton jbr = new JButton(".");
jbr.setFont(new Font("",0,20));
JButton jbs = new JButton("=");
jbs.setFont(new Font("",0,20));
JButton jbt = new JButton("/");
jbt.setFont(new Font("",0,20));
给这二十个按钮添加事件监听器
//实例化一个监听器
CalcuLoginListener cal = new CalcuLoginListener(jf,jteName);
// jba.setActionCommand("AC");
// jbb.setActionCommand("x2");
// jbc.setActionCommand("abs");
// jbd.setActionCommand("%");
// jbe.setActionCommand("1");
// jbf.setActionCommand("2");
// jbg.setActionCommand("3");
// jbh.setActionCommand("+");
// jbi.setActionCommand("4");
// jbj.setActionCommand("5");
// jbk.setActionCommand("6");
// jbl.setActionCommand("-");
// jbm.setActionCommand("7");
// jbn.setActionCommand("8");
// jbo.setActionCommand("9");
// jbp.setActionCommand("*");
// jbq.setActionCommand("0");
// jbr.setActionCommand(".");
// jbs.setActionCommand("=");
// jbt.setActionCommand("/");
//监听每一个按钮
jba.addActionListener(cal);
jbb.addActionListener(cal);
jbc.addActionListener(cal);
jbd.addActionListener(cal);
jbe.addActionListener(cal);
jbf.addActionListener(cal);
jbg.addActionListener(cal);
jbh.addActionListener(cal);
jbi.addActionListener(cal);
jbj.addActionListener(cal);
jbk.addActionListener(cal);
jbl.addActionListener(cal);
jbm.addActionListener(cal);
jbn.addActionListener(cal);
jbo.addActionListener(cal);
jbp.addActionListener(cal);
jbq.addActionListener(cal);
jbr.addActionListener(cal);
jbs.addActionListener(cal);
jbt.addActionListener(cal);
由于每个按钮都是不同的事件源,所以每个按钮都要添加监听器。
然后建立一个计算事件的处理类,该类实现ActionListener接口
/**
* 计算事件的处理类,该类实现ActionListener接口
* @author Administrator
*
*/
public class CalcuLoginListener implements ActionListener{
private JButton jbu;
private JTextArea jte;
private JFrame jf;
private int enterstyle,i;
private String enter,jtestr="0",jtestr1="0",ope1="?",ope2,ope,result="0";
//enter表示要输入的字符(未显示到输入框内),jtestr表示保存的字符,ope1表示保存的运算符,ope表示保存的符号(两者区别在等号,等号会影响判断)
//ope2表示当前运算符,result表示结算结果
//重载构造方法
public CalcuLoginListener(JFrame jf,JTextArea jte){
this.jf = jf;
this.jte = jte;
}
}
二、实现计算功能
给按钮添加监听器以及监听器类的建立都比较简单,不过在设计实现计算功能的处理方法时要稍动点脑筋。大体上计算器的风格为两类,一种是输入一整串的数字和运算符后输出计算结果;另一种是边输入边输出结果。
熊哥在课上讲的是第一种,对每个运算符依次编辑,当点击该运算符按钮时,提取显示出的该符号对应字符两边的字符串(运用字符串搜索、分割等方法),然后把两串字符串转化成对应的数字(Integer类里的parseInt方法)计算之后再重新转化为字符串输出。对于多种运算符先排好运算顺序再计算。
我自己写时觉得第二种简单一些(现在看都差不多= =),输入一串数字,记住当前数字,在输入运算符时记住之前数字运算符的字符代替数字的字符串,记住运算符号,再输入数字代替运算符,计算出结果,当下次点击等号时,将结果输出。
1.在输入框内正确显示输出结果分析
由于输入运算符与输入数字不同,所以每次输入都要进行判断该次输入的是什么,如果当前是数字输入的仍是数字,只需追加字符,不算状态更改;如果当前是数字输入的是运算符,则将数字改为运算符,算作状态更改;如果当前是运算符输入的是数字,则将运算符改为数字,算作状态更改;连续点击运算符的话、、、有必要么→ →。
我们的目的是计算,而计算需要一个符号和两个数字,而输入会更改当前状态,所以对输入的数字和符号要进行“保存”,从第二次输入运算符(或等号)开始每次输入运算符进行状态更改时都要进行结算,算出当前结果,把之前保存的运算结果(第一次结算用之前保存的数字)和当前输出的数字进行运算,运算符是上次的符号(即保存的符号),每次结算完更新运算结果,并保存当前符号;若输入等号则直接结算并输出运算结果。
为了方便追加字符,我把输入框的组件格式设置成了JTextArea,和JTextField比起来两个都能setText,getText,不过JTextArea有一个追加文本的函数append(还有插入文本的函数insert,在这个项目中用不到先记下),这样可以在每次输入数字时都可以不停的追加。
为了方便判断,我将按钮分成了五组
public int Style(String st){
if(st.equals("AC")||st.equals("x2")||st.equals("abs"))
i = 1;
if(st.equals("+")||st.equals("-")||st.equals("*")||st.equals("/")||st.equals("%"))
i = 2;
if(st.equals("="))
i = 3;
if(st.equals("?"))
i = 0;
if(st.equals("0")||st.equals("1")||st.equals("2")||st.equals("3")||st.equals("4")||st.equals("5")||st.equals("6")||st.equals("7")||st.equals("8")||st.equals("9")||st.equals("."))
i = 4;
return i;
}
本来要将这个函数名设为kind的。。。结果用了style。。。。
“?”表示符号的初始状态,之前定义变量时将未输入时符号的初始状态设为“?”,即未输入或第0次的符号。
2.实现运算
定义一个运算方法,实现加减乘除
//运算方法
public void Calculater(String st1,String st2,String st3){
int num1 = 0,num2 = 0,num;
//将字符串转化为数字
num1 = Integer.parseInt(st1);
num2 = Integer.parseInt(st2);
if(st3.equals("+"))
num1 += num2;
if(st3.equals("-"))
num1 -= num2;
if(st3.equals("*"))
num1 = num1*num2;
if(st3.equals("/"))
num1 = num1/num2;
if(st3.equals("%"))
num1 = num1%num2;
result = num1+"";//将数字转化为字符
jte.setText(result);
}
根据每次即将输入的按钮不同做判断进行运算并显示到输入框内
/**
* 事件处理方法
*/
public void actionPerformed(ActionEvent e){
//获取JButton上的字符
enter =e.getActionCommand();
//输入的style
enterstyle = Style(enter);
if(enterstyle == 3){//输入等号
jtestr = jte.getText();//保存数字
if(Style(ope1)==0)//之前未保存运算符,当前显示不变,并结算
result = jte.getText();
else if(Style(ope1)==2){//之前保存了运算符,结算,将运算符状态改为最初状态(未保存状态)
Calculater(result,jtestr,ope1);
ope1 = "?";
}
System.out.println(result);
ope = enter;//保存符号
}
if(enterstyle == 4){//若输入数字
//当前显示等号、0的话直接将改变字符
if(jte.getText().equals("="))
jte.setText(enter);
if(jte.getText().equals("0"))
jte.setText(enter);
else if(Style(jte.getText())==2){//当前显示为运算符,保存运算符再改变显示的字符
ope1 = ope2;
jte.setText(enter);
}
else//若显示为数字直接追加
jte.append(enter);
jtestr = jte.getText();
}
if(enterstyle == 2){//若要输入运算符
//保存当前数字
jtestr = jte.getText();
if(Style(ope1)==0)//之前未输入运算符,此次为首次输入运算符,结算
result = jte.getText();
else if(Style(ope1)==2){//之前输入了运算符,结算
Calculater(result,jtestr,ope1);
ope1 = "?";
}
System.out.println(result);
ope = enter;
ope2 = ope;
jte.setText(enter);
}
if(enterstyle == 1){//输入其他符号不显示只计算
if(enter.equals("AC")){//清空符号将所有变量恢复最初设置
jte.setText("0");jtestr="0";ope1="?";result="0";
}
if(enter.equals("x2")){//平方
Calculater(result,result,"*");
}
if(enter.equals("abs")){//取绝对值
int m = Integer.parseInt(result);
m = Math.abs(m);
result = m+"";
jte.setText(result);
}
}
}
由于只能进行整数运算,除法也只进行整数除法,所以小数点就废了,点击小数点会报错。。不过基本的运算功能算是实现了。。。