`
wz94
  • 浏览: 30938 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

计算器功能实现

阅读更多

 

    计算器界面的实现在之前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);
					
			}
		}

	}

 

由于只能进行整数运算,除法也只进行整数除法,所以小数点就废了,点击小数点会报错。。不过基本的运算功能算是实现了。。。



 

 
 

 

  • 大小: 23.8 KB
  • 大小: 23.2 KB
  • 大小: 25.3 KB
  • 大小: 23.5 KB
  • 大小: 18.7 KB
2
4
分享到:
评论
5 楼 wz94 2013-08-31  
freezingsky 写道
wz94 写道
luciferdevil 写道
定义数组arr = [按钮的text];
循环添加至面板并添加事件,总比一行一行手动写好,而且几十个jbtn……



学习了 不过ctrl c、ctrl v也不慢~~~

ctrl c、ctrl v是在你已经知道数量的情况下,如果扩展来想,传进来的是一个数组,长度未定,你还能ctrl c、ctrl v?吗

明白了,以后再遇到这种情况就用数组了
4 楼 freezingsky 2013-08-31  
wz94 写道
luciferdevil 写道
定义数组arr = [按钮的text];
循环添加至面板并添加事件,总比一行一行手动写好,而且几十个jbtn……



学习了 不过ctrl c、ctrl v也不慢~~~

ctrl c、ctrl v是在你已经知道数量的情况下,如果扩展来想,传进来的是一个数组,长度未定,你还能ctrl c、ctrl v?吗
3 楼 wz94 2013-08-30  
luciferdevil 写道
定义数组arr = [按钮的text];
循环添加至面板并添加事件,总比一行一行手动写好,而且几十个jbtn……



学习了 不过ctrl c、ctrl v也不慢~~~
2 楼 freezingsky 2013-08-29  
luciferdevil 写道
定义数组arr = [按钮的text];
循环添加至面板并添加事件,总比一行一行手动写好,而且几十个jbtn……

当年大学时刚开始学,也是这样反复敲。。。。。
1 楼 luciferdevil 2013-08-29  
定义数组arr = [按钮的text];
循环添加至面板并添加事件,总比一行一行手动写好,而且几十个jbtn……

相关推荐

Global site tag (gtag.js) - Google Analytics