java GUI 实现简单计算器

package calclutor;

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

public class Calculator extends JFrame {
	
	// 这一句的作用是什么?
	
	private static final long serialVersionUID = -1047298397568411277L;
	private JTextField textField;
    private ActionListener myListener;
    
	public Calculator() {
	
		setTitle("计算器"); // 设置名字为计算器
		setSize(300, 300); // 设置大下为 300x300
		setLocationRelativeTo(null); // 设置位置为居中
		setResizable(false); // 设置为大小不可变的
		setDefaultCloseOperation(EXIT_ON_CLOSE); // 可以退出
		
		
		Container container = getContentPane(); // 新建一个容器
        container.setLayout(new BorderLayout(5, 5)); // 设置左右间距为5像素
        
        
		JPanel pnlNorth = new JPanel();  // 北面面板
		JPanel pnlCenter = new JPanel();  // 中间面板
		
        // 把textFeild和panel 都放到容器上
		container.add(pnlNorth, BorderLayout.NORTH); // 把pnlNorth放在北面
        container.add(pnlCenter, BorderLayout.CENTER); // 把pnlCenter放在center面
		
        textField = new JTextField();  // 文本框设置
        textField.setFont(new Font("宋体", Font.PLAIN, 16));
        textField.setEditable(false);  // 不可修改
        textField.setHorizontalAlignment (JTextField.RIGHT); //设置输出右对齐
        
        //---------------
        pnlNorth.setLayout(new BorderLayout(5, 5)); // 设置上边的文本框和按钮的位置为边界布局
        //---------------
        
        JButton btnClear = useButton("<<<"); // new一个button按钮
        pnlNorth.add(textField, BorderLayout.CENTER); // 将文本框放到中间
		pnlNorth.add(btnClear, BorderLayout.EAST); // 将按钮放到做左边(西)
  
        String[] titles = {
				"7", "8", "9", "+", 
				"4", "5", "6", "-",
				"1", "2", "3", "*",
				"0", ".", "/", "="
		};
		
		// 设置下面放按钮的位置的panel为网格布局
		// 4x4的网格 button与button之间的距离为3像素
		pnlCenter.setLayout(new GridLayout(4, 4, 3, 3));
		for (int i = 0; i < titles.length; i++) {
			JButton btnNum = useButton(titles[i]);
			// btnNum.setFont(new Font("宋体", Font.PLAIN, 16));
			// 三个参数分别表示: 字体,样式(粗体,斜体等),字号
			btnNum.setFont(new Font("微软雅黑",Font.PLAIN, 24));
			pnlCenter.add(btnNum);
		}
       
    }
    
	public JButton useButton (final String titles) {
		/*
		 * String.valueof(x)  返回x的字符串表示
		 * 这里的titles之所以要用final修饰 是为了不被修改
		 * 然后后面使用String的valueof方法是为了将
		 */
		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);
    				action(key2);
    			}
			};
		}
        button.addActionListener(myListener);
		
        return button;
    }
	
	int len;
	String a, b, value; 
	char exit = '0'; // 初始化为=进入的时候避免多次进入case '=': 出错 ,在使用完之后置为=
	char op = 'n'; // 最听话的op 始终指向前一个操作符  这里的=是逻辑意义上的得到运算结果的意思
	boolean flag = false;
	//  flag 为false的时候进行数字长度增加的操作
	//  flag 为true的时候进行数字首次输入的操作
	private void action(char key2){
        /*
         * 在计算器的运算中整体的数字都是被转化为了double型的
         * Double.parseDouble ...
         * 
         */
    	String text;
    	switch(key2){
        	/*
        	 * 例如:
        	 * 		首先你输入一串数字:如果下一个符号为 + - * / 中的任意一个
        	 * 		首先将textfeild里面的值清空
        	 * 		再将操作符置为   + - *  / 
        	 * 		
        	 * 		!"".equals(textField.getText())   在textField上不存在字符串的时候
			 *		
        	 *      多个点的时候    两个数之间多次点击加减乘除的时候
        	 *      多次加减乘除
        	 */
	        case '1':
	        case '2':
	        case '3':
	        case '4':
	        case '5':
	        case '6':
	        case '7':
	        case '8':
	        case '9':
	        case '0':
	        	/*
	        	 * 当flag为true的时候进行前面的字符串的清空,后面的第一个字符的输入
	        	 * 当flag为false的时候进行后面的字符串的输入
	        	 */
	        	if (flag) {
	        		textField.setText("");
	        		textField.setText(String.valueOf(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 '<':          	   
            	text = textField.getText(); // 获取当前的字符串
            	if(!"".equals(text)){
            		len = text.length();
                	text = text.substring(0, len-1);
                	textField.setText(text);
            	}
            	text="";
            	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;
            default: ;   // 在本计算器程序中没有其它情况
        }
    }
    
    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;	
            default: ;
        }
    	value = String.valueOf(v);
    }
    public static void main(String[] args) {
		new Calculator().setVisible(true);
    }
}
右边的清除一次只能清除一个字符,特殊功能双击=可以实现数据的清空,例如:输入一个233之后直接按=就会清空数据。
  • 17
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值