JAVA学习--基于GUI的简易计算器的设计与实现

在这里插入图片描述

package Calculator;
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Calculatorface extends JFrame {
	
	private JTextField textField;//单行文本输入框
    private ActionListener myListener;//监听机
    
//表面
    
	public Calculatorface() {
		
		setTitle("计算器"); // 设置名字
		setSize(400, 400); // 设置大小
		setLocationRelativeTo(null); // 设置位置为居中
		setResizable(false); // 设置为大小不可变
		setDefaultCloseOperation(EXIT_ON_CLOSE); // 可以退出
		
		Container container = getContentPane(); // 新建一个容器
        container.setLayout(new BorderLayout(5, 5)); // 设置左右间距为5像素        
		JPanel panelall = new JPanel();  // 设置总体大面板
		JPanel panel = new JPanel();  //设置下方小面板	
		JPanel panel1 = new JPanel();  //设置下方小面板1
		JPanel panel2 = new JPanel();  //设置下方小面板2
		container.add(panelall); // 把大面板放到容器上
		panelall.setLayout(new BorderLayout(5, 5)); // 设置为边界布局
		panel.setLayout(new BorderLayout(5, 5)); // 设置为边界布局
	
        textField = new JTextField();  // 文本框设置
        textField.setFont(new Font("宋体", Font.PLAIN, 20)); //格式
        textField.setEditable(false);  // 不可修改
        textField.setHorizontalAlignment (JTextField.RIGHT); //设置输出右对齐
        panelall.add(textField, BorderLayout.NORTH); // 将文本框放到北面
        
        JButton btnback = useButton("Back"); //退格
        JButton btnce = useButton("CE");  //清零
		btnback.setFont(new Font("微软雅黑",Font.PLAIN, 24));  //设置相关字体
		btnce.setFont(new Font("微软雅黑",Font.PLAIN, 24));
		panel1.add(btnback,BorderLayout.NORTH);  //加到小面板1
		panel1.add(btnce,BorderLayout.NORTH);
		panel1.setLayout(new GridLayout(1, 2, 3, 3));  //网格布局
		
        String[] titles = {
				"7", "8", "9", "/", 
				"4", "5", "6", "*",
				"1", "2", "3", "-",
				"0", "~+/-", ".", "+",
				"l/x","%","sqrt","="
		};		//数字计算
		panel2.setLayout(new GridLayout(5, 4, 3, 3)); //网格布局
		for (int i = 0; i < titles.length; i++) {
			JButton btnNum = useButton(titles[i]);
			btnNum.setFont(new Font("微软雅黑",Font.PLAIN, 24));
			panel2.add(btnNum);
		}    //都加到小面板2上去
		
		panel.add("North",panel1);  //back ce 加到小面板北面
		panel.add("Center",panel2);  //数字计算加到小面板 南面
		panelall.add("Center",panel);  //把小面板加到大面板中心位置
    }
	
//监听
	
	public JButton useButton (final String titles) {
		// String.valueof(x)  返回x的字符串表示
		JButton button = new JButton(String.valueOf(titles));
		if(myListener == null){
			myListener = new ActionListener(){
				public void actionPerformed(ActionEvent event){
      				String  btnInformation  = event.getActionCommand();
    				char key2 = btnInformation.charAt(0);  //目的是使用switch case 
    				action(key2);  
    			}
			};
		}
        button.addActionListener(myListener);
        return button;
    }
	
//计算
	
	int len;  // 输入长度
	String a, b, value;  // 第一个输入的,第二个输入的, 结果
	char exit = '0'; // 保证 = 有意义
	char op = 'n'; 
	boolean flag = false;
	//  flag 为true的时候进行前面的字符串的清空,后面的第一个字符的输入
	//  flag 为false的时候进行后面的字符串的输入
	
	private void action(char key2){
    	String text;
   	
    	switch(key2){
	        case '1':
	        case '2':
	        case '3':
	        case '4':
	        case '5':
	        case '6':
	        case '7':
	        case '8':
	        case '9':
	        case '0':   //输入数字

	        	if (flag) {
	        		textField.setText(""); //清零
	        		textField.setText(String.valueOf(key2));  //输入key2
	        		flag = false;  //继续输入
				} 
	        	else {
					text = textField.getText() + key2;  //接前面的输入
		        	textField.setText(text); //设置新的字符串
		        	text = ""; 	 //清空text					
				}
	            break;
	            
	        case '.':   //小数点
	        	if("".equals(textField.getText()))    //如果前面的字符串为空
	        		break;    // 第一个元素不能为.         	
	        	if(!"".equals(textField.getText())){   // 不为空
	        		text = textField.getText();    //得到当前字符串
					len = text.length();
					int i = 0;
					for(; i<len; i++) {
						if('.' == text.charAt(i))  break;  
					} 
					if(i<len)  
						break;  // 确认字符串中是否已经存在.
					text = textField.getText() + key2;   
		            textField.setText(text);   //新的字符串
		            text = "";
		        }	
	        	break;	
	            
        	case '+':    
        		if(!"".equals(textField.getText())){
        			if ('n' == op) {
        				a = textField.getText();
        				op = '+'; 
        				flag = true;
        			} else {
        				b = textField.getText();
        				calculation(a, b);
        				a = value;   //可以继续运算
        				textField.setText(value);
        				op = '+';
        				flag = true;
        			}
        			exit = '1';
        		}
        		break;
                
            case '-':
            	if(!"".equals(textField.getText())){
        			if ('n' == op) {
        				a = textField.getText();
        				op = '-'; 
        				flag = true;
        			} else {
        				b = textField.getText();
        				calculation(a, b);
        				a = value;
        				textField.setText(value);
        				op = '-';
        				flag = true;
        			}
        			exit = '1';
        		}
        		break;
            	
            case '*':
            	if(!"".equals(textField.getText())){
        			if ('n' == op) {
        				a = textField.getText();
        				op = '*'; 
        				flag = true;
        			} else {
        				b = textField.getText();
        				calculation(a, b);
        				a = value;
        				textField.setText(value);
        				op = '*';
        				flag = true;
        			}
        			exit = '1';
        		}
        		break;
                
            case '/':
            	if(!"".equals(textField.getText())){
        			if ('n' == op) {
        				a = textField.getText();
        				op = '/'; 
        				flag = true;
        			} else {
        				b = textField.getText();
        				calculation(a, b);
        				a = value;
        				textField.setText(value);
        				op = '/';
        				flag = true;
        			}
        			exit = '1';
        		}
        		break;
        		
            case '%':   //取余
            	if(!"".equals(textField.getText())){
        			if ('n' == op) {
        				a = textField.getText();
        				op = '%'; 
        				flag = true;
        			} else {
        				b = textField.getText();
        				calculation(a, b);
        				a = value;
        				textField.setText(value);
        				op = '%';
        				flag = true;
        			}
        			exit = '1';
        		}
        		break;
        		
            case 'l':  //倒数 
            	if(!"".equals(textField.getText())){
            		text = textField.getText();
                	text = String.valueOf(1/Float.parseFloat(text));  
                	textField.setText(text);
                	text="";
            	}
              	break;
        		
            case 's':   //根号
            	if(!"".equals(textField.getText())){
            		text = textField.getText();
                	text = String.valueOf(Math.sqrt(Float.parseFloat(text)));
                	textField.setText(text);
            	    text="";
            	}
        		break;
        		
            case '~':   //正负数
            	if(!"".equals(textField.getText())){
            		text = textField.getText();
                	text = String.valueOf((-1)*Float.parseFloat(text));
                	textField.setText(text);
                	text="";
            	}
              	break;
                
            case 'B':     //退格
            	text = textField.getText(); 
            	if(!"".equals(text)){
            		len = text.length();
                	text = text.substring(0, len-1);
                	textField.setText(text);
            	}
            	text="";
            	break;
            	
            case 'C':   //清零
            	textField.setText("");
            	break;
   
            case '=':   //等于
            	if('0' == exit){
            		textField.setText("");
            		break;
            	}
            	if("".equals(textField.getText())) // 排除  7*=  7+= 之类错误
            		break;
            	b = textField.getText();
            	calculation(a, b);
                textField.setText(String.valueOf(value));
                break;
        }
    }
 
	//两个数的计算
	
    private void calculation(String a, String b){
    	double v1 = Double.parseDouble(a);
    	double v2 = Double.parseDouble(b);
    	double v=0;
    	switch(op){
            case '+':
                v = v1 + v2;
                exit = '0';
                a = b = null;
                op = 'n';
                break;
				
            case '-':
                v = v1 - v2;
                exit = '0';
                a = b = null;
                op = 'n';
                break;
				
            case '*':
                v = (v1) * (v2);
                exit = '0';
                a = b = null;
                op = 'n';
                break;
				
            case '/':
            	if(v2==0) break;
                v = v1 / v2;
                exit = '0';
                a = b = null;
                op = 'n';
                break;	
                
            case '%':
            	if(v2==0) break;
                v = v1 % v2;
                exit = '0';
                a = b = null;
                op = 'n';
                break;	

        }
    	value = String.valueOf(v);
    }
    
    //main
    
    public static void main(String[] args) {
		new Calculatorface().setVisible(true);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值