Java入门 简易计算器

package begin;
/*
  计算器:
     1.显示共两行,上为计算过程,下为计算结果或输入数字
     2.可同时实现多个实数的四则运算。
     3。运算范围为double。
     4.可按钮输入,也可键盘输入。
     5.每次只能从最高位向最低位输入。
     6.键盘输入加减乘除与按钮加减乘除有所不同,键盘输入的运算符会保留在输入栏。( 尚未找到解决方法   )
     7.只能输入数字、加、减、乘、除、等于、换行(回车)符,一个实数亦只能有一个小数点,若输入错误,计算将重新开始。
  
 */

public class MainClass {
	public static void main(String arg[]){
		Calculator test = new Calculator();
		test.display();
	}
}


代码不难理解,就不解释了,直接上代码

package begin;

import java.math.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


public class Calculator extends JFrame {
	
	private JTextField tf1,tf2;   //过程框,输入及结果框
	private JButton btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn0,btnp;
	private JButton addBtn,subBtn,mulBtn,divBtn,equalBtn;
	private int cWidth=300, cHeight=400;
	
	
	private long count=0L;     //运算符号数目
	private double a=0,x=0;    //输入数字,运算结果
	private int mode=1;        //运算模式
	private double pointX=0;   //小数位
	private boolean flag =true;  //当前是否为a的第一个数字
	private boolean flagKey = false ; //当前是否为键盘输入
	private double stackNum[] = new double[100];   
	private int top=-1;
	
	Calculator(){
		super("计算器");
		super.setResizable(false);
		int sx=10,sy=10,dx=10,tfH=50,dy=10,btnDx=25;
		
		tf1 = new JTextField();
		tf1.setEditable(false);
		tf1.setBounds(sx, sy,cWidth-2*sx , tfH);
		tf1.setHorizontalAlignment(JTextField.RIGHT);
		tf1.setBackground(Color.WHITE);
		tf1.setBorder(null);
		tf1.setFont(new Font("Times",Font.CENTER_BASELINE,15));
		
		tf2 = new JTextField();
		tf2.setEditable(true);
		tf2.setBounds(sx, sy+tfH,cWidth-2*sx , tfH);
		tf2.setHorizontalAlignment(JTextField.RIGHT);
		tf2.setBorder(null);
		tf2.setFont(new Font("Times",Font.BOLD,20));
		
		int btnW=(cWidth-2*sx-3*btnDx)/4,btnH=btnW-btnW%10;
		sy=sy+tfH+tfH;
		
		addBtn = new JButton("+");
		addBtn.setFont(new Font("Times",Font.BOLD,20));//字体,粗体,字号
		addBtn.setBounds(sx, sy+dy, btnW, btnH);
		subBtn = new JButton("-");
		subBtn.setBounds(sx+btnDx+btnW, sy+dy, btnW, btnH);
		subBtn.setFont(new Font("Times",Font.BOLD,20));
		mulBtn = new JButton("*");
		mulBtn.setBounds(sx+2*(btnDx+btnW), sy+dy, btnW, btnH);
		mulBtn.setFont(new Font("Times",Font.BOLD,20));
		divBtn = new JButton("/");
		divBtn.setBounds(sx+3*(btnDx+btnW), sy+dy, btnW, btnH);
		divBtn.setFont(new Font("Times",Font.BOLD,20));
		
		sy=sy+dy+btnH+dy;
		
		
		btn1 = new JButton("1");
		btn1.setBounds(sx, sy, btnW, btnW);
		btn2 = new JButton("2");
		btn2.setBounds(sx+btnDx+btnW , sy, btnW, btnW);
		btn3 = new JButton("3");
		btn3.setBounds(sx+2*(btnDx+btnW), sy, btnW, btnW);
		btn0 = new JButton("0");
		btn0.setBounds(sx+3*(btnDx+btnW), sy, btnW, btnW);
		
		sy+=dy+btnH;
		
		btn4 = new JButton("4");
		btn4.setBounds(sx, sy, btnW, btnW);
		btn5 = new JButton("5");
		btn5.setBounds(sx+btnDx+btnW , sy, btnW, btnW);
		btn6 = new JButton("6");
		btn6.setBounds(sx+2*(btnDx+btnW), sy, btnW, btnW);
		btnp = new JButton(".");
		btnp.setBounds(sx+3*(btnDx+btnW), sy, btnW, btnW);
		btnp.setFont(new Font("Times",Font.BOLD,20));
		
		sy+=dy+btnH;
		
		btn7 = new JButton("7");
		btn7.setBounds(sx, sy, btnW, btnW);
		btn8 = new JButton("8");
		btn8.setBounds(sx+btnDx+btnW , sy, btnW, btnW);
		btn9 = new JButton("9");
		btn9.setBounds(sx+2*(btnDx+btnW), sy, btnW, btnW);
		equalBtn = new JButton("=");
		equalBtn.setBounds(sx+3*(btnDx+btnW), sy, btnW, btnW);
		equalBtn.setFont(new Font("Times",Font.BOLD,20));
	}
	
	
	public void display(){
		
		Container c = this.getContentPane();
		c.setLayout(null);
		c.add(tf1);	
		c.add(tf2);
		c.add(addBtn);
		c.add(subBtn);
		c.add(mulBtn);
		c.add(divBtn);
		c.add(btn0);
		c.add(btn1);
		c.add(btn2);
		c.add(btn3);
		c.add(btn4);
		c.add(btn5);
		c.add(btn6);
		c.add(btn7);
		c.add(btn8);
		c.add(btn9);
		c.add(btnp);
		c.add(equalBtn);
		
		
		MyEventHandler handler = new MyEventHandler();
		btn0.addActionListener(handler);
		btn1.addActionListener(handler);
		btn2.addActionListener(handler);
		btn3.addActionListener(handler);
		btn4.addActionListener(handler);
		btn5.addActionListener(handler);
		btn6.addActionListener(handler);
		btn7.addActionListener(handler);
		btn8.addActionListener(handler);
		btn9.addActionListener(handler);
		btnp.addActionListener(handler);
		addBtn.addActionListener(handler);
		subBtn.addActionListener(handler);
		mulBtn.addActionListener(handler);
		divBtn.addActionListener(handler);
		equalBtn.addActionListener(handler);
		
		
		MyKeyHandler keyHandler = new MyKeyHandler();
		tf2.addKeyListener(keyHandler);
		
		this.setSize(cWidth,cHeight);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocationRelativeTo(null);
		this.setVisible(true);
		
	}
	private class MyEventHandler implements ActionListener{
    	public void actionPerformed(ActionEvent e){
    		if(e.getSource()==btn1){
    			flagKey = false;
    			in1();
    		}
    		if(e.getSource()==btn2){
    			flagKey = false;
    			in2();	
    		}
    		if(e.getSource()==btn3){
    			flagKey = false;
    			in3();
    		}
    		if(e.getSource()==btn4){
    			flagKey = false;
    			in4();
    			
    		}
    		if(e.getSource()==btn5){
    			flagKey = false;
    			in5();
    		}
    		if(e.getSource()==btn6){
    			flagKey = false;
    			in6();
    			
    		}
    		if(e.getSource()==btn7){
    			flagKey = false;
    			in7();
    			
    		}
    		if(e.getSource()==btn8){
    			flagKey = false;
    			in8();
    			
    		}
    		if(e.getSource()==btn9){
    			flagKey = false;
    			in9();
    			
    		}
    		if(e.getSource()==btn0){
    			flagKey = false;
    			in0();
    			
    		}
    		if(e.getSource()==btnp){
    			flagKey = false;
    			inp();
    		}

    		if(e.getSource()==addBtn){
    			flagKey = false;
    			inadd();
    		}
    		if(e.getSource()==subBtn){
    			flagKey = false;
    			insub();
    		}
    		if(e.getSource()==mulBtn){
    			flagKey = false;
    			inmul();
    		}
    		if(e.getSource()==divBtn){
    			flagKey = false;
    			indiv();
    		}
    		if(e.getSource()==equalBtn){
    			flagKey = false;
    			inequal();
    		}
    		
    	}
	}
	private void in1(){
		if(flagKey == false){
			String str = "1";
			if(flag)
				str = tf2.getText() + "1";
			else
				flag = true;
			tf2.setText(str);
		}
		
		if(pointX>0){
			a+=1.0/pointX;
			pointX*=10;
		}
		else
			a = a*10 + 1;
		
	}
	private void in2(){
		if(flagKey == false){
			String str = "2";
			if(flag)
				str = tf2.getText()+"2";
			else
				flag = true;
			tf2.setText(str);
		}

		if(pointX>0){
			a+=2.0/pointX;
			pointX*=10;
		}
		else
			a = a*10 + 2;

	}
	private void in3(){
		if(flagKey == false){
			String str = "3";
			if(flag)
				str = tf2.getText()+"3";
			else
				flag = true;
			tf2.setText(str);
		}

		if(pointX>0){
			a+=3.0/pointX;
			pointX*=10;
		}
		else
			a = a*10 + 3;
		
	}
	private void in4(){
		if(flagKey == false){
			String str = "4";
			if(flag)
				str = tf2.getText()+"4";
			else
				flag = true;
			tf2.setText(str);
		}

		if(pointX>0){
			a+=4.0/pointX;
			pointX*=10;
		}
		else
			a = a*10 + 4;
	}
	private void in5(){
		if(flagKey == false){
			String str = "5";
			if(flag)
				str = tf2.getText()+"5";
			else
				flag = true;
			tf2.setText(str);
		}
		if(pointX>0){
			a+=5.0/pointX;
			pointX*=10;
		}
		else
			a = a*10 + 5;
	}
	private void in6(){
		if(flagKey == false){
			String str = "6";
			if(flag)
				str = tf2.getText()+"6";
			else
				flag = true;
			tf2.setText(str);
		}
		
		if(pointX>0){
			a+=6.0/pointX;
			pointX*=10;
		}
		else
			a = a*10 + 6;
	}
	private void in7(){
		if(flagKey == false){
			String str = "7" ;
			if(flag)
				str =  tf2.getText()+"7";
			else
				flag = true;
			tf2.setText(str);
		}
		if(pointX>0){
			a+=7.0/pointX;
			pointX*=10;
		}
		else
			a = a*10 + 7;
	}
	private void in8(){
		if(flagKey == false){
			String str = "8";
			if(flag)
				str = tf2.getText()+"8";
			else
				flag = true;
			tf2.setText(str);
		}
		
		
		if(pointX>0){
			a+=8.0/pointX;
			pointX*=10;
		}
		else
			a = a*10 + 8;
		
	}
	private void in9(){
		if(flagKey == false){
			String str = "9";
			if(flag)
				str = tf2.getText()+"9";
			else
				flag = true;
			tf2.setText(str);
		}
		
		if(pointX>0){
			a+=9.0/pointX;
			pointX*=10;
		}
		else
			a = a*10 + 9;
		
	}
	private void in0(){
		if(flagKey == false){
			String str = "0";
			if(flag)
				str = tf2.getText()+"0";
			else
				flag = true;
			tf2.setText(str);
		}
		
		if(pointX>0){
			a+=0.0/pointX;
			pointX*=10;
		}
		else
			a = a*10 + 0;
	}
	private void inp(){
		if(pointX>0){
			infalse();
			return;
		}
		if(flagKey == false){
			String str = "0.";
			if(flag)
				str = tf2.getText()+".";
			else
				flag = true;
			tf2.setText(str);
		}
		pointX=10;
	}
	private void inadd(){
		count++;
		
		switch(mode){
		
		case 1:stackNum[++top] = a;x+=a;break;
		case 2:stackNum[++top] = -a;x-=a;break;
		case 3:
		case 4:stackNum[top] = Calculate(stackNum[top],a);x+=  stackNum[top]; 
		}
		
		
		String ac=Double.toString(a),
				xc=Double.toString(x);
		if(count==1){
			tf1.setText(xc.toString()+'+');
			tf2.setText("");
		}
		else{
			String str1 = tf1.getText() + ac+'+';
			tf1.setText(str1);
			tf2.setText(xc);
		}
		a=0;
		mode=1;
		flag=false;
		pointX=0;
	}
	private void insub(){
		count++;
		switch(mode){
		
		case 1:stackNum[++top] = a;x+=a;break;
		case 2:stackNum[++top] = -a;x-=a;break;
		case 3:
		case 4:stackNum[top] = Calculate(stackNum[top],a);x+=  stackNum[top]; 
		}
		
		String ac=Double.toString(a),
				xc=Double.toString(x);
		if(count==1){
			tf1.setText(xc.toString()+'-');
			tf2.setText("");
		}
		else{
			String str1 = tf1.getText() + ac+'-';
			tf1.setText(str1);
			tf2.setText(xc);
		}
		a=0L;
		mode=2;
		flag=false;
		pointX=0;
	}
	private void inmul(){
		count++;
		
		
		if(mode<3||top==-1){
			if(mode==1)
				stackNum[++top] = a;
			else
				stackNum[++top] = -a;
		}
		else{
			//System.out.println(stackNum[top]);
			stackNum[top]=Calculate(stackNum[top],a);  //此时 stackNum[top]i-1 =  ai*ai-1 或 ai/ai-1
		}
		
		
		
		String ac=Double.toString(a),
				xc=Double.toString(x);
		if(count==1){
			tf1.setText(ac.toString()+'*');
			tf2.setText("");
		}
		else{
			String str1 = tf1.getText() + ac+'*';
			tf1.setText(str1);
			tf2.setText(xc);
		}
		a=0;
		mode=3;
		flag=false;
		pointX=0;
	}
	private void indiv(){
		count++;
		
		if(mode<3||top==-1){
			
			if(mode==1)
				stackNum[++top] = a;
			else
				stackNum[++top] = -a;
		}
		else{
			
			//System.out.println(stackNum[top]);
			stackNum[top]=Calculate(stackNum[top],a);  //此时 stackNum[top]i-1 =  ai*ai-1 或 ai/ai-1
		}
		
		String ac=Double.toString(a),
				xc=Double.toString(x);
		if(count==1){
			tf1.setText(xc.toString()+'/');
			tf2.setText("");
		}
		else{
			String str1 = tf1.getText() + ac+'/';
			tf1.setText(str1);
			tf2.setText(xc);
		}
		a=0;
		mode=4;
		flag=false;
		pointX=0;
	}
    private void inequal(){
    	
    	switch(mode){
		
		case 1:x+=a;break;
		case 2:x-=a;break;
		case 3:
		case 4:stackNum[top] = Calculate(stackNum[top],a);x+=  stackNum[top]; 
		}
    	
    	
		String xc=Double.toString(x);
		tf1.setText("");
		tf2.setText(xc);
		
		//清空
		
		top=-1;
		count=0;
		a=0;
		mode=1;
		flag=false;
		pointX=0;
		x=0;
	}
    private void infalse(){
    	JOptionPane.showMessageDialog(null, "输入数据有误,计算重新开始!");
    	tf1.setText("");
    	tf2.setText("");
    	count=0;
		a=0;
		mode=1;
		flag=false;
		pointX=0;
		x=0;
    }
	private double Calculate(Double y,Double z){
		
		if(mode==1)
			return y+z;
		if(mode==2)
			return y-z;
		if(mode==3)
			return y*z;
		else
			return y/z;
	}
	 
	private class MyKeyHandler extends KeyAdapter{
		public void keyTyped(KeyEvent e){
			
			if(e.getKeyChar()=='\n'||e.getKeyChar()=='='){
				inequal();
			}
			else if(e.getKeyChar()=='+'){
				//tf2.setText("");
				inadd();
			}
			else if(e.getKeyChar()=='-'){
				insub();
			}
			else if(e.getKeyChar()=='*'){
				inmul();
			}
			else if(e.getKeyChar()=='/'){
				indiv();
			}
			else if(e.getKeyChar()=='0'){
				flagKey = true;
				in0();
			}
			else if(e.getKeyChar()=='1'){
				flagKey = true;
				in1();
			}
			else if(e.getKeyChar()=='2'){
				flagKey = true;
				in2();
			}
			else if(e.getKeyChar()=='3'){
				flagKey = true;
				in3();
			}
			else if(e.getKeyChar()=='4'){
				flagKey = true;
				in4();
			}
			else if(e.getKeyChar()=='5'){
				flagKey = true;
				in5();
			}
			else if(e.getKeyChar()=='6'){
				flagKey = true;
				in6();
			}
			else if(e.getKeyChar()=='7'){
				flagKey = true;
				in7();
			}
			else if(e.getKeyChar()=='8'){
				flagKey = true;
				in8();
			}
			else if(e.getKeyChar()=='9'){
				flagKey = true;
				in9();
			}
			else if(e.getKeyChar()=='.'){
				flagKey = true;
				inp();
			}
			else{
				infalse();
			}
		}
		
	}
	
}


运行结果

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值