首页>代码>java swing实现简单的计算器源代码程序>/Calculator/src/com/test/TestCalculate.java
package com.test;

import java.awt.*;
import java.awt.event.*;

public class TestCalculate
{
	public static void main(String[] args)
	{
		new Calculate().launch();
	}	
} 

class Calculate extends Frame
{
	private boolean firstFlag = true;
	private String str1 = "";
	private String str2 = "";
	private TextField tf = null;
	private String strOper = null;   //20行  strOper用来记录到底是+还是-还是*还是/操作,因为我们点击"="按钮时是无法通过该事件得到上次我们执行的到底是+还是-还是*还是/操作,所以我们需要定义一个属性strOper来记录单击"="之前的上次执行的操作
	
	
	public void launch()
	{
		Frame f = new Frame();
		f.setTitle("简单实现的计算器");
		tf = new TextField(30);
		tf.setBackground(Color.WHITE);
		//setLayout(new BorderLayout());  //Frame默认的布局管理器就是BorderLayout
		f.add(tf, BorderLayout.NORTH);
		Panel p = new Panel(new GridLayout(4, 4, 5, 5));
		for (int i=0; i<10; ++i)
		{
			Button bn = new Button("" + i);
			bn.setActionCommand("数字");
			p.add(bn);
			bn.addActionListener(new MyMonitor());			
		}
		
		Button bnAdd = new Button("+");  
		p.add(bnAdd);
		bnAdd.setActionCommand("算术操作");
		bnAdd.addActionListener(new MyMonitor());
		
		Button bnSub = new Button("-");  
		p.add(bnSub);
		bnSub.setActionCommand("算术操作");
		bnSub.addActionListener(new MyMonitor());
		
		Button bnMult = new Button("*"); 
		bnMult.addActionListener(new MyMonitor()); 
		p.add(bnMult);
		bnMult.setActionCommand("算术操作");
		
		Button bnDiv = new Button("/");  
		p.add(bnDiv);
		bnDiv.setActionCommand("算术操作");
		bnDiv.addActionListener(new MyMonitor());
		
		Button bnEq = new Button("=");  
		p.add(bnEq);
		bnEq.setActionCommand("=");
		bnEq.addActionListener(new MyMonitor());
		
		Button bnClear = new Button("清零");  
		p.add(bnClear);
		bnClear.setActionCommand("清零");
		bnClear.addActionListener(new MyMonitor());
		
		p.add(bnAdd);
		p.add(bnSub);
		p.add(bnMult);
		p.add(bnDiv);
		p.add(bnEq);
		p.add(bnClear);		
		
		f.add(p, BorderLayout.CENTER);
		f.setBounds(200, 200,300, 300);
		f.setBackground(Color.CYAN);
		f.setVisible(true);
		f.addWindowListener(  new WindowAdapter()
							  {
									@Override
									public void windowClosing(WindowEvent e)
									{
										System.exit(-1);
									} 				
							  }		
		);
	}
	
	
	//内部类
	class MyMonitor implements ActionListener
	{
		public void actionPerformed(ActionEvent e)
		{
			//如果是对=按钮的点击操作,则我们需要得到上次动作命令名称的信息,因为本次事件中只能得到按钮标签的信息= 和 按钮动作命令名称=, 无法得到上次执行的到底是+还是-还是*还是/操作,所以我们需要单独定义一个属性用来记录动作命令名称的信息,参见20行代码
			/*actionPerformed()方法算法如下:
				第一:	我们必须先得通过e得到按钮的动作命令名称strAc和按钮标签字符串的
						信息strLab
				第二:  然后通过判断按钮的动作命令名称strAc来执行不同的操作,即:
						如果strAc是"数字",即如果是对0-9按钮的单击操作, 则更新str1 或者 str2的值
						如果strAc是"算术操作",即如果是对"+" "-" "*" "/"按钮的单击操作,则我们必须得把按钮标签字符窜strLb的值赋给属性strOper, 注意不能把strAc赋给strOper, 因为此时strAc的值是"算术操作"  
						如果strAc是"=", 则。。。。。。略
						如果strAc是"清零",则。。。。。。略
			
			*/
			
			
			String strAc = e.getActionCommand();
			Button bn = (Button)e.getSource();
			String strLb = bn.getLabel();
			
			if (strAc.equals("数字"))
			{
				if (firstFlag)
				{
					str1 = str1 + strLb;   //103
					tf.setText(str1);
				}
				else
				{
					str2 = str2 + strLb;  //109
					tf.setText(str2);
				}
			}
			else if (strAc.equals("算术操作"))  //如果是+ - * / 操作 
			{
				strOper = strLb;  //118   千万不要写成了 strOper = strAc;  因为本语句要被执行的话,此时strAc的值一定是"算术操作", 我们需要的是+ - * / 即我们需要的是按钮标签字符窜的信息
				firstFlag = false;
			}
			else if (strAc.equals("="))
			{
				result();
			}
			else if (strAc.equals("清零"))
			{
				str1 = str2 = "";
				tf.setText("");
				firstFlag = true;
			}				
		}
	}
	
	public void result()
	{
		double num1 = Double.parseDouble(str1);
		double num2 = Double.parseDouble(str2);
		double num3 = 0;
		
		if (strOper.equals("+"))
		{
			num3 = num1 + num2;
		}
		else if (strOper.equals("-"))
		{
			num3 = num1 - num2;
		}
		else if (strOper.equals("*"))
		{
			num3 = num1 * num2;
		}
		else if (strOper.equals("/"))
		{
			num3 = num1 / num2;
		}
		
		tf.setText("" + num3);
		str1 = String.valueOf(num3);   //不能写成了 str1 = str2;
		str2 = "";
		//firstFlag = false;	  //本行代码可以省略	
	}	
}

最近下载更多
light13277  LV1 11月10日
imporfat  LV1 9月7日
yushibujue321  LV2 9月4日
ma406805131  LV15 6月25日
张吉骏  LV1 5月27日
2272789815  LV1 1月7日
1719361876  LV1 2023年12月29日
怪人mjl  LV2 2023年12月25日
1112WHQ  LV7 2023年11月3日
微信网友_6519594366078976  LV1 2023年6月15日
最近浏览更多
light13277  LV1 11月10日
顶顶顶顶顶1234 10月30日
暂无贡献等级
imporfat  LV1 9月7日
yushibujue321  LV2 9月4日
好烦好烦 9月4日
暂无贡献等级
azzzz1  LV2 6月26日
ma406805131  LV15 6月25日
lilitu  LV6 5月31日
张吉骏  LV1 5月27日
22344341  LV2 4月21日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友