计算器界面的实现在之前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); } } }
由于只能进行整数运算,除法也只进行整数除法,所以小数点就废了,点击小数点会报错。。不过基本的运算功能算是实现了。。。