⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calcappdemo.java

📁 java经典10例子
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;

class CalcAppDemo extends Frame{
    private TextField t_result;
    private Panel p_main;//主面板
    private Panel p_num;//数字面板
    private Panel p_oper;//操作符面板
    private Panel p_show;//显示面板
    private Button b_num[];//数字按钮
    private Button b_oper[];//操作符按钮

    public CalcAppDemo(String title){
		setTitle(title);
		t_result = new TextField("0.0",21);
		p_main = new Panel();
		p_num = new Panel();
		p_oper = new Panel();
		p_show = new Panel();
		p_main.setLayout(new BorderLayout());
		p_num.setLayout(new GridLayout(4,3,1,1));
		p_oper.setLayout(new GridLayout(4,2,1,1));
		
		b_num = new Button[12];
		for(int i = 0;i < 9;i++){
	        b_num[i] = new Button(new Integer(i+1).toString());
		}
		b_num[9] = new Button("0");
		b_num[10] = new Button("cls");
		b_num[11] = new Button(".");
		for(int i = 0;i < 12;i++){
	        p_num.add(b_num[i]);
		}
		
		b_oper = new Button[8];
		b_oper[0] = new Button("+");
		b_oper[1] = new Button("-");
		b_oper[2] = new Button("*");
		b_oper[3] = new Button("/");
		b_oper[4] = new Button("pow");
		b_oper[5] = new Button("sqrt");
		b_oper[6] = new Button("+/-");
		b_oper[7] = new Button("=");
		for(int i = 0;i < 8;i++){
	        p_oper.add(b_oper[i]);
		}
		
		t_result.setEditable(false);
		p_show.add(t_result,BorderLayout.NORTH);
		p_main.add(p_show,BorderLayout.NORTH);
		p_main.add(p_num,BorderLayout.WEST);
		p_main.add(p_oper,BorderLayout.EAST);
		this.add(p_main,BorderLayout.CENTER);
		setSize(400,400);
		setResizable(false);
		pack();
		
		this.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				    System.exit(0);
			}
		});
		ButtonListener bl = new ButtonListener();
		for(int i=0;i<12;i++){
			b_num[i].addActionListener(bl);
		}
		for(int i = 0;i < 8;i++){
	    	b_oper[i].addActionListener(bl);
	    }
	}
	
	class ButtonListener implements ActionListener {
		private String lastOp;	//存储上一次操作符
		private String strVal;	//存储数字对应的字符串 
		private double total;	//总数
		private double number;	//存储新输入的数
		private boolean firsttime;//判断是否第一次按下的是操作符按钮	
		private boolean operatorPressed;//判断是否已经按过操作符按钮 
		
		ButtonListener( ){	
		   firsttime = true;
		   strVal = "";
		}
		
		//事件处理器
		public void actionPerformed( ActionEvent e ){
			String s = ((Button)e.getSource()).getLabel().trim();
			
			if(Character.isDigit(s.charAt(0))){//判断是操作数还是操作符		
				handleNumber(s);					
			}else{
			    calculate(s);
			}	    	   		
		}
		
		//判断是一元操作符还是二元操作符,并根据操作符类型做计算
		void calculate( String op ){
		  	operatorPressed = true;
		  
			if(firsttime&&!isUnary(op)){
		  		total = getNumberOnDisplay();  	
		  		firsttime = false;
		   	}    
		    if (isUnary(op)){   	
		    	handleUnaryOp(op);        
		    }else if (lastOp != null){		
				handleBinaryOp(lastOp);		
			}
		   	if (!isUnary(op)){//存储上一次按下的操作符
		         lastOp = op;
		    }         
		}
		
		//判断是否是一元操作符
		boolean isUnary(String s){
			return    s.equals( "=" )
			       || s.equals( "cls" )
			       || s.equals( "sqrt" ) 
			       || s.equals( "+/-" )
			       || s.equals( "." );	       		
		}	
		
		//处理一元操作符
		void handleUnaryOp( String op ){
			if ( op.equals( "+/-" ) ){  
		         //将显示框中的数字取反 	 
		         number = negate(getNumberOnDisplay()+""); 
		         t_result.setText(""); 
		         t_result.setText( number + ""); 	    	    
		         return;        	
		    }else if (op.equals(".")){
		       	 handleDecPoint();
		       	 return;
		    }else if(op.equals("sqrt")){    	 			     
			     number = Math.sqrt(getNumberOnDisplay());
			     t_result.setText("");
			     t_result.setText(number+"");
			     return;	     	   
		    }else if(op.equals("=")){
		       	 //在按下"="前已经按下一个二元运算符
		       	 if(lastOp!=null&&!isUnary(lastOp)){ 
		       	      handleBinaryOp(lastOp);
		       	 }
		       	 lastOp=null;
		         firsttime=true;
		         return;
		    }else{ 
		       clear();
		    }   
		}
		
		//处理二元运算符
		void handleBinaryOp(String op){
			if(op.equals("+")){ 
				 total += number;	
			}else if(op.equals("-")){
				 total -= number;
			}else if(op.equals("*")){
				 total *= number;
			}else if(op.equals("/")){
				try{
				 total /=number;
				}catch(ArithmeticException ae){}
			}else if(op.equals("pow"))
			     total=Math.pow(total,number);
	//		t_result.setText("");
			lastOp = null;
	//		strVal = "";
			number = 0; 				   
		    t_result.setText(total+"");		    	
		}
		
		//该方法用于处理数字按钮
		void handleNumber(String s){
			if (!operatorPressed){//连接按下的数字按钮的值
				strVal+=s;
			}else{//当按下操作符按钮时,清除strVal并存储输入的第一个数值
				operatorPressed = false;
				strVal = s;		
			}
			//将strVal转换为double 
			number=new Double(strVal).doubleValue();
			t_result.setText("");	
			t_result.setText(strVal);
		}
		
		//该方法用于按下"."按钮
		void handleDecPoint(){
			operatorPressed = false;
			//如果该字符串中无".",放置一个"."在字符串末尾
			if ( strVal.indexOf( "." ) < 0 ) {
			     strVal+=".";	
			}
			t_result.setText("");      
			t_result.setText( strVal );
		}
		
		//该方法用于将一个数求反
		double negate( String s ){
			operatorPressed = false;
			//如果是一个整数,去掉小数点后面的0
			if ( number == ( int ) number ){
			     s = s.substring(0, s.indexOf( "." ) );
			 }
			//如果无"-"增加在该数的前面	
			if ( s.indexOf( "-" ) < 0 ){
			     strVal = "-"+s;
			}else{//如果有"-"则去掉
				strVal = s.substring( 1 );
			}	  
			return new Double( strVal ).doubleValue();  
		}
		
		//将显示框中的值转换为Double
		double getNumberOnDisplay() {
		   	return new Double(t_result.getText()).doubleValue();	
		}
		
		//清除屏幕并设置所有的标识
		void clear(){
			firsttime = true;
			lastOp = null;
			strVal = "";
			total = 0;
			number = 0;
			t_result.setText("0");
		}
	}
		
    public static void main(String args[]){
		CalcAppDemo c = new CalcAppDemo("简单的计算器程序");
		c.setVisible(true);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -