java计算器源码

今天花了一个下午加一个晚上写了个计算器的小程序,用swing写了界面,实现了加、减、乘、除的简单计算,其中小数点花了我一点时间~可能还有bug吧~现在放出源码,仅供交流~望大家找出bug,多多指教!

package com.xijiepc.Calculator;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class MyCalculator implements ActionListener{
	
	private JFrame frame;//计算器的框架
	private JMenuBar menu;//计算器的菜单栏
	private JMenu edit,help;//计算器的菜单按钮
	private JMenuItem copy,paste,about;//计算器的下拉子菜单
	private JTextField textField;//计算器的输入输出框
	private JPanel mainPanel;//主面板
	private JPanel funPanel;//功能面板
	private JPanel numberPanel;//数字面板
	private JButton backSpaceBtn,CBtn,CEBtn;//退格键,清空键,清空缓存
	private String[] str={"7","8","9","/","4","5","6","*","1","2","3","-","0",".","=","+"};//数字键盘字符
	
	private StringBuffer strBuff;//输入输出框中的缓存字符
	private double temp1,temp2;//计算的第一个数和第二个数
	private int index;//+ - * /的索引
	private double result;//运算的结果
	private boolean hasNewNumber=true;//判断是否需要连续运算
	
	public void CrateLayout(){
	    frame =new JFrame("Calculator");
		/*
		 * 菜单栏
		 */
		menu =new JMenuBar();
		frame.setJMenuBar(menu);
		edit=new JMenu(" 编辑(E)");
		help=new JMenu(" 帮助(H)");
		menu.add(edit);
		menu.add(help);
		copy=new JMenuItem(" 复制(C)");
		paste=new JMenuItem(" 粘贴(P)");
		about=new JMenuItem(" 关于(A)");
		edit.add(copy);
		edit.add(paste);
		help.add(about);
		
		strBuff=new StringBuffer();
		textField =new JTextField("0",10);//输入输出文本框
		textField.setHorizontalAlignment(JTextField.RIGHT); //设置文本框显示字符右对齐
		frame.add(textField, BorderLayout.NORTH);//将文本框加入窗体的北方
		
		mainPanel=new JPanel();
		frame.add(mainPanel, BorderLayout.CENTER);//将主面板添加到窗体中间
		/*
		 * 功能面板设计
		 */
		funPanel=new JPanel();
		backSpaceBtn=new JButton("BackSpace");//退格键
		backSpaceBtn.addActionListener(this);//增加监听器
		backSpaceBtn.setForeground(Color.RED);
		CBtn=new JButton("C");//清除键
		CBtn.addActionListener(this);//增加C的监听器
		CBtn.setForeground(Color.RED);
		CEBtn=new JButton("CE");//清空缓存
		CEBtn.addActionListener(this);//增加CE的监听器
		CEBtn.setForeground(Color.RED);
		funPanel.add(backSpaceBtn);//将回车键添加到功能面板中
		funPanel.add(CBtn);//将清除键添加到功能面板中
		funPanel.add(CEBtn);
		mainPanel.add(funPanel, BorderLayout.NORTH);//将功能面板排列到主面板的北区
		/*
		 * 数字面板设计
		 */
		numberPanel=new JPanel();
		numberPanel.setLayout(new GridLayout(4,4,8,8));
		for(int i=0;i<str.length;i++){
			JButton ButtonTemp=new JButton(str[i]);
			if(i==3||i==7||i==11||i==13||i==14||i==15){
				ButtonTemp.setForeground(Color.RED);
			}
			numberPanel.add(ButtonTemp);
			ButtonTemp.addActionListener(this);
		}
        mainPanel.add(numberPanel);//在主面板中添加数字面板

		frame.pack();
		frame.setResizable(false);//禁用最大化按钮
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(new Dimension(220, 270));
		frame.setVisible(true);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		String s = e.getActionCommand();
		if(s.equals("BackSpace")){//BackSpace功能
			try{
				if(!textField.getText().trim().equals("0.")){//如果显示屏显示的不是0
					if(textField.getText().trim().length()!=1){//如果缓存字符数不为1就将最后一个字符删除
						textField.setText(strBuff.delete(strBuff.length()-1, strBuff.length()).toString());
					}else{//否则设置初值为0
						textField.setText("0.");
						strBuff.setLength(0);
					}
				}
			}catch(Exception ex){}
			temp2=Double.parseDouble(textField.getText().trim());
			hasNewNumber=true;
		}else if(s.equals("CE")){//CE清零
			textField.setText("0.");
			strBuff.setLength(0);
			hasNewNumber=true;
		}else if(s.equals("C")){//C清零
			textField.setText("0.");
			strBuff.setLength(0);
			temp1=0d;
			temp2=0d;
			hasNewNumber=true;
		}else if(s.equals("+")){//加法运算
			temp1=Double.parseDouble(textField.getText().trim());
			strBuff.setLength(0);
			temp2=0d;
			index=0;
			hasNewNumber=true;
		}else if(s.equals("-")){//减法运算
			temp1=Double.parseDouble(textField.getText().trim());
			strBuff.setLength(0);
			temp2=0d;
			index=1;
			hasNewNumber=true;
		}else if(s.equals("*")){//乘法运算
			temp1=Double.parseDouble(textField.getText().trim());
			strBuff.setLength(0);
			temp2=0d;
			index=2;
			hasNewNumber=true;
		}else if(s.equals("/")){//除法运算
			temp1=Double.parseDouble(textField.getText().trim());
			strBuff.setLength(0);
			temp2=0d;
			index=3;
			hasNewNumber=true;
		}else if(s.equals("=")){
			if(hasNewNumber){//如果有新的数就开始新的计算
				switch(index){
				case 0:
					result=temp1+temp2;
					if(result-(int)result==0){//如果结果是整数就去掉小数点后的无效0
						textField.setText(""+(int)result);
					}else{//否则就直接输出
						textField.setText(""+result);
					}
					break;
				case 1:
					result=temp1-temp2;
					if(result-(int)result==0){
						textField.setText(""+(int)result);
					}else{
						textField.setText(""+result);
					}
					break;
				case 2:
					result=temp1*temp2;
					if(result-(int)result==0){
						textField.setText(""+(int)result);
					}else{
						textField.setText(""+result);
					}
					break;
				case 3:
					if(temp2==0){
						textField.setText("除数不能为零");
						break;
					}else{
						result=temp1/temp2;
						if(result-(int)result==0){
							textField.setText(""+(int)result);
						}else{
							textField.setText(""+result);
						}
						break;
					}
				default :
						break;
				}
				hasNewNumber=false;
			}else{//连续点击等号就继续计算
				switch(index){
				case 0:
					result+=temp2;
					if(result-(int)result==0){
						textField.setText(""+(int)result);
					}else{
						textField.setText(""+result);
					}
					break;
				case 1:
					result-=temp2;
					if(result-(int)result==0){
						textField.setText(""+(int)result);
					}else{
						textField.setText(""+result);
					}
					break;
				case 2:
					result*=temp2;
					if(result-(int)result==0){
						textField.setText(""+(int)result);
					}else{
						textField.setText(""+result);
					}
					break;
				case 3:
					if(temp2==0){
						textField.setText("除数不能为零");
						break;
					}else{
						result/=temp2;
						if(result-(int)result==0){
							textField.setText(""+(int)result);
						}else{
							textField.setText(""+result);
						}
						break;
					}
				default :
						break;
				}
			}
			strBuff.setLength(0);//当重新输入数字时清除以前的
		}else if(s.equals(".")){//小数点运算
			if(textField.getText().trim().equals("0.")){
				strBuff.setLength(0);
				textField.setText(strBuff.append("0.").toString());
			}else if(textField.getText().trim().equals("0")){
				strBuff.setLength(0);
				textField.setText(strBuff.append("0.").toString());
			}else
				textField.setText(strBuff.append(s).toString());
			temp2=0d;
			hasNewNumber=true;
		}else{//其他按键的情况
			textField.setText(strBuff.append(s).toString());
			temp2=Double.parseDouble(textField.getText().trim());
			hasNewNumber=true;
		}
	}
	
	public static void main(String[] args) {
		MyCalculator calculator=new MyCalculator();
		calculator.CrateLayout();
	}
}


计算器的界面

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值