JAVA语言课程设计——计算器的制作

1.设计内容

设计GUI界面的计算器程序,用户可以通过鼠标依次选择参加计算的数值,然后进行加、减、乘、除等混合运算。

效果如图:计算器界面

2.设计要求:要求GUI界面计算器是一个使用方便的程序,界面要简洁大方,易用性好,能进行加、减、乘、除等混合运算。

3.设计思想

  1. 搭建界面
  2. 计算方法是难点。X1  Y  X2  Z  R(1+1=2)。X1代表第一个操作数,Y代表运算符(初值为0),X2代表第二个操作数,Z代表
  3. 事件响应分为3大类:
  4. 第一类数字键,第二类运算符,第三类功能键
  5. 数字键的处理方法:设定一个变量k=1,如果k=1,表示应该新起一个数字,将这个数字直接添加到文本框tf中,k++。如果k>1,表示这个数字没写完,字符串s获得文本框中的值,连接上点击的按钮数字,再写回文本框tf中。
  6. 运算符+、-、*、/、=、1/x、-/+、sqrt的处理方法:X2得到tf中的值。G=1代表这些按钮被第一次按下。Y=1,2,3,4代表+-*/运算。如果g==1,说明第一个数结束,将X2的值赋值给X1。如果g>1,说明之前有过操作数,这次是连续运算,因此要将之前的两个数运算后将结果赋值给第一个数,即X1=X1 Y X2。然后Y记录这次的运算符,g++,k=1。Tf文本框显示X1如果是单目运算符,这次计算后就是结果,下次计算不能再次使用本次操作符,所以要g=1。然后X1=X1 Y,Tf文本框显示X1,注意(除法不能除0,开方不能为负,倒数不能为0)
  7. 功能键的处理方法:“backspace,”将tf文本框中的字符串去掉末尾一位,“CE”,将运算公式全都初始化,运算数清0,“C”,将tf文本框的当前数清0,“小数点”将当前文本框内容连接小数点,k++。
  8. 窗口关闭处理,响应窗口关闭事件。

话不多说,直接上代码:

package test;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class  Calculator extends WindowAdapter implements ActionListener{
	private Frame f;
	private MenuBar mb;
	private Menu m1,m2,m3;
	private Panel p1,p2,p3,p4,p5;
	private TextField tf1,tf2;
	private Button b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28;
	private double sum0=0,sum1=0;//sum0第一个操作数,sum1第二个操作数,m=1,n=1;
	private int i=0,k=1,g=1,n=1;//k=1代表一个数字新开始,g=1代表以前没有按过操作符,i代表操作符1,2,3,4代表+-*/
	public void display() {//搭建界面
		f=new Frame("计算器");
		f.setLayout(new BorderLayout(8,8));
		addmyMenu(f);             //添加菜单
		tf1=new TextField();
		f.add(tf1,"North");  //设置计算器文本框在最上方
		tf1.setEditable(false);//不允许修改结果文本框
		addmyPanel(f);              //搭建中间界面
		f.setSize(250,250);
		f.setLocation(500,50);
		f.setBackground(Color.lightGray); 
		f.addWindowListener(this);
		f.setVisible(true);
	}
	public void addmyMenu(Frame f) {  //添加菜单上各种选项
		mb=new MenuBar();
		f.setMenuBar(mb);          //添加菜单条
		m1=new Menu("编辑");
	    m2=new Menu("查看");
	    m3=new Menu("帮助");        //添加菜单项
	    mb.add(m1);
	    mb.add(m2);
	    mb.add(m3);               
	    m1.add(new MenuItem("复制"));
	    MenuItem mi=new MenuItem("粘贴");
	    mi.setEnabled(false);            //添加快捷键 
	    m1.add(mi);
	    m2.add(new MenuItem("标准型"));
	    m2.add(new MenuItem("科学型"));
	    m2.addSeparator();               //添加分割线
	    m2.add(new MenuItem("数字分组"));
	    m3.add(new MenuItem("帮助主题"));
	    m3.addSeparator();
	    m3.add(new MenuItem("关于计算器"));
	}
	public void addmyPanel(Frame f) {         //添加界面上的各种按钮
		p1=new Panel();
		p1.setLayout(new BorderLayout(8,8));  //8行8列
		f.add(p1,"Center");
	    p2=new Panel();
	    p2.setLayout(new GridLayout(1,3,5,5)); //中间上行功能键,1行3列
	    b21=new Button("Backspace");
	    b21.setForeground(Color.red);
	    b21.addActionListener(this);     //Backspace的事件响应
	    p2.add(b21);
	    b22=new Button("CE");
	    b22.setForeground(Color.red);
	    b22.addActionListener(this);     //CE的事件响应
	    p2.add(b22);
	    b23=new Button("C");
	    b23.setForeground(Color.red);
	    b23.addActionListener(this);     //C的事件响应
	    p2.add(b23);
	    p3=new Panel(new GridLayout(6,1,5,5)); //左侧的布局5行1列
	    p1.add(p3,"West");
	    tf2=new TextField(2);
		tf2.setEditable(true);				  //允许编辑
		p3.add(tf2);
	    b24=new Button("MC");
	    b24.setForeground(Color.red);         //MC按钮
	    p3.add(b24);
	    b25=new Button("MR");
	    b25.setForeground(Color.red);         //MR按钮
	    p3.add(b25);
	    b26=new Button("MS");
	   	b26.setForeground(Color.red);         //MS按钮
	   	p3.add(b26);
	   	b27=new Button("M+");
	   	b27.setForeground(Color.red);         //M+按钮
	   	p3.add(b27);
	   	b28=new Button("M-");
	   	b28.setForeground(Color.red);		  //M-按钮
	   	p3.add(b28);
	   	p4=new Panel(new GridLayout(4,5,5,5));//具体操作键4行5列
	   	p1.add(p4);
	   	b7=new Button("7");
	   	b7.setForeground(Color.blue);
	   	b7.addActionListener(this);
	   	p4.add(b7);                            //7
	   	b8=new Button("8");
	   	b8.setForeground(Color.blue);
	   	b8.addActionListener(this);
	   	p4.add(b8);                            //8
	   	b9=new Button("9");
	   	b9.setForeground(Color.blue);
	   	b9.addActionListener(this);
	   	p4.add(b9);                            //9
	   	b11=new Button("/");
	   	b11.setForeground(Color.red);
	   	b11.addActionListener(this);
	   	p4.add(b11);                           // 运算符/法
	   	b12=new Button("sqrt");
	   	b12.setForeground(Color.blue);
	   	b12.addActionListener(this);
	   	p4.add(b12);                            // 运算符开方
       	b4=new Button("4");
	   	b4.setForeground(Color.blue);
	   	b4.addActionListener(this);
	   	p4.add(b4);                             //4
	   	b5=new Button("5");
	   	b5.setForeground(Color.blue);
	   	b5.addActionListener(this);
	   	p4.add(b5);                             //5
	   	b6=new Button("6");
	   	b6.setForeground(Color.blue);
	   	b6.addActionListener(this);
	   	p4.add(b6);                             //6
	   	b13=new Button("*");
	   	b13.setForeground(Color.red);
	   	b13.addActionListener(this);
	   	p4.add(b13);                            //运算符*法
	   	b14=new Button("%");
	   	b14.setForeground(Color.blue);
	   	b14.addActionListener(this);
	   	p4.add(b14);                           // 运算符%法
	   	b1=new Button("1");
	   	b1.setForeground(Color.blue);
	   	b1.addActionListener(this);
	   	p4.add(b1);                            //1
	    b2=new Button("2");
	    b2.setForeground(Color.blue);
	    b2.addActionListener(this);
	    p4.add(b2);                             //2
	    b3=new Button("3");
	    b3.setForeground(Color.blue);
	    b3.addActionListener(this);
	    p4.add(b3);                            //3
	    b15=new Button("-");
	    b15.setForeground(Color.red);
	    b15.addActionListener(this);
	    p4.add(b15);                           //运算符-法
	    b16=new Button("1/x");
	    b16.setForeground(Color.blue);
	    b16.addActionListener(this);
	    p4.add(b16);                           //运算符到数
	   	b10=new Button("0");
	    b10.setForeground(Color.blue);
	    b10.addActionListener(this);
	    p4.add(b10);                           //0
	    b17=new Button("+/-");
	    b17.setForeground(Color.blue);
	    b17.addActionListener(this);
	    p4.add(b17);                            //取反
	    b18=new Button(".");
	    b18.setForeground(Color.blue);
	    b18.addActionListener(this);
	    p4.add(b18);                           //小数点
	    b19=new Button("+");
	    b19.setForeground(Color.red);
	    b19.addActionListener(this);
	    p4.add(b19);                            //运算符+法
	    b20=new Button("=");
	    b20.setForeground(Color.red);
	    b20.addActionListener(this);
	    p4.add(b20);                            //运算符=
	    p5=new Panel(new BorderLayout(8,8));
	    p1.add(p5);
	    p5.add(p2,"North");
	    p5.add(p4,"Center");                    //搭建中间界面
	}
	public void actionPerformed(ActionEvent e) {
		if(e.getSource().equals(b10)||e.getSource().equals(b1)||e.getSource().equals(b2)||e.getSource().equals(b3)||e.getSource().equals(b4)||e.getSource().equals(b5)||e.getSource().equals(b6)||e.getSource().equals(b7)||e.getSource().equals(b8)||e.getSource().equals(b9)) {
			String s=e.getActionCommand().trim();//获取数字
			if(k==1) {tf1.setText(s);k++;}//将数字直接写到文本框中,k=1代表新开始一个数字      
			else {tf1.setText(tf1.getText()+s);}//追加到文本框中
		}
		if(e.getSource().equals(b11)||e.getSource().equals(b13)||e.getSource().equals(b15)||e.getSource().equals(b19)||e.getSource().equals(b12)||e.getSource().equals(b14)||e.getSource().equals(b16)||e.getSource().equals(b17)||e.getSource().equals(b20)) {
			String n=e.getActionCommand().trim();
			sum1=Double.parseDouble(tf1.getText());
			if(g==1) {sum0=sum1;tf1.setText(tf1.getText()+n);}//如果是第一次按下运算符操作键,将获得的数赋给第一个操作数sum0
			else {//如果是第二次按运算符,需要先计算上一次结果
				if(i==0) {}//i=1,2,3,4代表+,-,*,/
				if(i==1) {sum0=sum0+sum1;}
				if(i==2) {sum0=sum0-sum1;}
				if(i==3) {sum0=sum0*sum1;}
				n=String.valueOf(sum0);//结果转化为字符串
				if(i==4) {
					if(sum1==0) {n="不合法";}
					else {sum0=sum0/sum1;n=String.valueOf(sum0);}
				}
				tf1.setText(n);
			}
			if(e.getSource().equals(b19)) {i=1;}//+
			if(e.getSource().equals(b15)) {i=2;}//-
			if(e.getSource().equals(b13)) {i=3;}//*
			if(e.getSource().equals(b11)) {i=4;}//'/'
			g++;//运算符被按下一次
			k=1;//下一个数字重新开始
			if(e.getSource().equals(b20)) {g=1;}//等于号,下一次运算重新开始
			if(e.getSource().equals(b12)) {//开方
				if(sum0<0) {n="不合法";}
				else {sum0=Math.sqrt(sum0);n=String.valueOf(sum0);}tf1.setText(n);
			}
			if(e.getSource().equals(b14)) {//百分号
				if(sum0!=0) {sum0=sum0/100;}n=String.valueOf(sum0);tf1.setText(n);
			}
			if(e.getSource().equals(b16)) {//倒数
				if(sum0<0||sum0==0) {n="不合法";}
				else {sum0=1/sum0;n=String.valueOf(sum0);}tf1.setText(n);
			}
			if(e.getSource().equals(b17)) {//取反
				if(sum0!=0) {sum0=sum0*(-1);}n=String.valueOf(sum0);tf1.setText(n);
			}
		}
		if(e.getSource().equals(b18)) {//小数点
			String r=tf1.getText()+".";
			tf1.setText(r);
			k++;
		}
		if(e.getSource().equals(b21)) {//退位键
			String t=tf1.getText();
			t=t.substring(0,t.length()-1);
			tf1.setText(t);
		}
		if(e.getSource().equals(b22)) {//CE
			sum0=0;sum1=0;i=0;g=1;k=1;
			tf1.setText("0");
		}
		if(e.getSource().equals(b23)) {//C
			sum1=0;
			tf1.setText("0");
		}
	}
	public void windowClosing(WindowEvent e){//响应窗口事件
		System.exit(0);//退出系统
	}
	public static void main(String[] args) {
        Calculator j=new Calculator(); 
		j.display();
	}
}

另外 储存功能没有做,等以后有机会再详细补全哈

  • 10
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值