java 仿windows计算器

java做的仿windows计算器
可以实现科学型和标准型的转换,标准型的功能完善,科学型的功能没全部写
java小白,有啥问题希望大神可以指正!!

下列代码是标准型的代码,科学型的可以自己补充,无非就是复制粘贴调参

package Jisuanqi;

/**  简易计算器   开根号只能先输入数字在点击开根号
 * created by 晴眸若初
 * 
 */

import javax.swing.*;

import java.awt.BorderLayout;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;

public class Calculator extends JFrame implements ActionListener{
	//创建一个界面窗口
	private JFrame jiemian = new JFrame();
	//创建按键的名字,并创建对应的按钮
	private String[] keys = {"%","CE","C","Back","1⁄x","X²","√x","÷","7","8","9","X","4","5","6","-","1","2","3","+","+/-","0",".","="};
	private JButton[] buttons = new JButton[keys.length];
	//计算的结果 文本框显示  result_txt
	private JTextField result_txt = new JTextField("0");
	//标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字
	private boolean firstDigit = true;
	//当前运算的运算符
	private String now_key = "=";
	//计算的中间结果 
	private double resultNum = 0.0000; 
	//判断当前操作是否合法
	private boolean operatelegal = true;
	//创建菜单
	//private Menu mineMenu;
	
	private JMenu menu;
	private JMenu help;
	private JMenuItem biaozhun;
	private JMenuItem kexue;
	private JMenuItem about;
	public Calculator() {
		init(); //初始化计算器
		jiemian.setTitle("简易计算器  by 晴眸若初");
		jiemian.setSize(380,450);
		jiemian.setLocation(500, 300);
		//不允许修改计算器窗口大小
		jiemian.setResizable(false);
		
		JMenuBar zkm = new JMenuBar();
		jiemian.setJMenuBar(zkm);
		
		jiemian.setVisible(true);
		
		menu = new JMenu("菜单");
		help = new JMenu("帮助");
		biaozhun = new JMenuItem("标准型(B)");
		kexue  = new JMenuItem("科学型(K)");
		about = new JMenuItem("关于(P)");
		menu.add(biaozhun);
		biaozhun.setMnemonic('b');
		menu.add(kexue);
		kexue.setMnemonic('k');
	    help.add(about);
		about.setMnemonic('p');
		
		zkm.add(menu);
		zkm.add(help);
		
		
        kexue.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
			    new Calculator2();
			    jiemian.setVisible(false);
			}
		});
        
//        biaozhun.addActionListener(new ActionListener(){
//			public void actionPerformed(ActionEvent e) {
//				new Calculator();
//				//Calculator2.this.setVisible(false);
//			}
//		});
        
		about.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                new About();

            }
        });

        jiemian.pack();
        
        

		//关闭窗口
		jiemian.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}
	/**
	 * 调用主函数,运行程序
	 */
	public static void main(String[] args) {
		try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        }catch(Exception e) {
        	System.out.println(e);
        }

        new Calculator();
    }
	
	/**
	 * 初始化函数 init();
	 * 
	 */
	private void init() {
		//设置各个部分颜色
		Color color1 = new Color(150, 150, 150);  //功能键和运算符颜色 中灰色
        Color color2 = new Color(137, 207, 240);  //等于号专属颜色  浅蓝色
        Color color3 = new Color(232, 232, 232);  //背景颜色也是灰色  深灰色
	    

        
        JPanel Panel = new JPanel();
        Panel.setLayout(new BorderLayout());
        Panel.add(result_txt);
        //设置文本框中文字的字体以及大小,加粗,内容采用右对齐方式
        result_txt.setFont(new Font("楷体",Font.BOLD,43));  
        result_txt.setHorizontalAlignment(JTextField.RIGHT);  
        result_txt.setEditable(false);  //不能修改结果文本框
        result_txt.setBorder(null);  //删除文本框的边框
        // 设置文本框背景颜色
        result_txt.setBackground(color1);
        
        //创建一个放置按钮的面板
        JPanel keysPanel = new JPanel();
        //网格布局,6行4列,网格之间水平与垂直间隔2像素
        keysPanel.setLayout(new GridLayout(6, 4, 2, 2));
        //初始化前两行按键的功能
        for(int i = 0; i < 8; i++) {
            buttons[i] = new JButton(keys[i]);
            keysPanel.add(buttons[i]);
            buttons[i].setBackground(color3);
            //设置按钮文本的前景色
            buttons[i].setForeground(Color.black); 
            //设置字体显示效果  18磅粗的字体
            buttons[i].setFont(new Font(Font.SERIF, Font.PLAIN, 18));
            buttons[i].setBorderPainted(false);  //去除按钮的边框
        }
        for(int i = 8; i < keys.length; i++) {
            buttons[i] = new JButton(keys[i]);
            keysPanel.add(buttons[i]);
            if((i+1)%4==0) buttons[i].setBackground(color3);  //将三四五行第四列的按钮设置为color3
            else buttons[i].setBackground(Color.white);
            buttons[i].setForeground(Color.black);
            buttons[i].setFont(new Font(Font.SERIF, Font.PLAIN, 18));
            buttons[i].setBorderPainted(false);  //去除按钮的边框
        }
        //“=”键使用浅蓝色  按钮所在面板使用深灰色
        buttons[23].setBackground(color2);
        keysPanel.setBackground(color1);
        //将文本框放在北部,将按钮面板放在中部
        jiemian.getContentPane().add("North", Panel);
        jiemian.getContentPane().add("Center", keysPanel);
        //设置面板的边框属性
        Panel.setBorder(BorderFactory.createMatteBorder(25,3,1,3,color1));
        keysPanel.setBorder(BorderFactory.createMatteBorder(6,3,3,3,color1));
        
        //添加事件监听器  
        for(int i=0;i<keys.length;i++) {
        	buttons[i].addActionListener(this);
        }
	}
	/**
	 * 事件监听
	 */
	public void actionPerformed(ActionEvent e) {
		//获取事件,即用户的指令
		String zhiling = e.getActionCommand();
		if(zhiling.equals(keys[3])) {
			//用户点了“back”
			goBack();
		}else if(zhiling.equals(keys[1])) {
			//用户按了“CE”,当前数字清零
			result_txt.setText("0");
		}else if(zhiling.equals(keys[2])) {
			//用户按“C”,初始化计算器
			goC();
		}else if("0123456789.".indexOf(zhiling) >= 0) {
			//利用indexOf判断,若是没有出现0-9和.,则返回-1
			goNum(zhiling);
		}else if(zhiling.equals(keys[0]) || zhiling.equals(keys[4]) || zhiling.equals(keys[5]) ||
				zhiling.equals(keys[6]) || zhiling.equals(keys[20])) {
            // 用户按了"求倒数,%,开方,平方,取正负数"
            goDeal1(zhiling);
        } else {
            goDeal2(zhiling);
        }
		
	}
	/**
	 *  当用户按下“Back”后如何处理
	 */
	 private void goBack() {
	        String text = result_txt.getText();
	        int i = text.length();
	        if (i > 0) {
	            text = text.substring(0, i - 1);  // 退格,将文本最后一个字符去掉
	            if (text.length() == 0) {
	                // 如果文本没有内容了,则初始化计算器的各种值
	            	result_txt.setText("0");
	                firstDigit = true;
	                now_key = "=";
	            } else {
	                // 显示新的文本
	            	result_txt.setText(text);
	            }
	        }
	 }
	 /**
	  * 当用户按下“C”后如何处理:初始化计算器
	  */
	 private void goC() {
	        // 初始化计算器的各种值
		    result_txt.setText("0");
	        firstDigit = true;
	        now_key = "=";
	    }
	 /**
	  * 当用户按下数字键后如何处理
	  */
	 private void goNum(String key) {
	        if (firstDigit) {
	            // 输入的为第一个数
	        	result_txt.setText(key);
	        } else if ((key.equals(".")) && (result_txt.getText().indexOf(".") < 0)) {
	            // 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面
	        	result_txt.setText(result_txt.getText() + ".");
	        } else if (!key.equals(".")) {
	            // 如果输入的不是小数点,则将数字附在结果文本框的后面
	        	result_txt.setText(result_txt.getText() + key);
	        }
	        firstDigit = false;
	    }
	 /**
	  * 当用户按下运算符后如何处理,分两种情况:1.简单单目运算符 2.双目运算符
	  */
	 //第一种情况
	 private void goDeal1(String key) {
	        now_key = key;  // 运算符为用户按的按钮
	        if (now_key.equals("1⁄x")) {
	            // 倒数运算
	            if (resultNum == 0) {
	            	operatelegal = false;  //操作不合法
	                result_txt.setText("零没有倒数");
	            } else {
	                resultNum = 1 / getNumberFromText();
	            }
	        } else if (now_key.equals("√x")) {
	            // 开平方运算
	            if (resultNum < 0) {
	            	operatelegal = false;  //操作不合法
	                result_txt.setText("根号内不能为负");
	            } else {
	                resultNum = Math.sqrt(getNumberFromText());
	            }
	        } else if (now_key.equals("X²")) {
	            // 平方运算
	            resultNum = getNumberFromText()*getNumberFromText();
	        } else if (now_key.equals("%")) {
	            // 百分号运算,除以100
	            resultNum = getNumberFromText() / 100;
	        } else if (now_key.equals("+/-")) {
	            // 正数负数运算
	            resultNum = getNumberFromText() * (-1);
	            if (operatelegal) {
	                // 操作合法的情况下,结果为小数保留小数点后4位,整数正常输出
	                long t1;
	                double t2;
	                t1 = (long) resultNum;
	                t2 = resultNum - t1;
	                if (t2 == 0) {
	                    result_txt.setText(String.valueOf(t1));
	                } else {
	                    result_txt.setText(String.valueOf(new DecimalFormat("0.0000").format(resultNum)));
	                }
	            }
	            firstDigit = true;
	            operatelegal = true;
	        }
	    }
	 //第二种情况
	 private void goDeal2(String key) {
		 
		 if (now_key.equals("÷")) { //除法运算
	            // 如果当前结果文本框中的值等于0
	            if (getNumberFromText() == 0.0) {
	                operatelegal = false;  //操作不合法
	                result_txt.setText("除数不能为零");
	            } else {
	                resultNum /= getNumberFromText();
	            }
	        } else if (now_key.equals("+")) {
	            // 加法运算
	            resultNum += getNumberFromText();
	        } else if (now_key.equals("-")) {
	            // 减法运算
	            resultNum -= getNumberFromText();
	        } else if (now_key.equals("X")) {
	            // 乘法运算
	            resultNum *= getNumberFromText();
	        } else if (now_key.equals("=")) {
	            // 赋值运算
	            resultNum = getNumberFromText();
	        }
	        if (operatelegal) {
	            // 操作合法的情况下,结果为小数保留小数点后4位,整数正常输出
	            long t1;
	            double t2;
	            t1 = (long) resultNum;
	            t2 = resultNum - t1;
	            if (t2 == 0) {
	                result_txt.setText(String.valueOf(t1));
	            } else {
	                result_txt.setText(String.valueOf(new DecimalFormat("0.0000").format(resultNum)));
	            }
	        }
	        now_key = key;  // 运算符为用户按的按钮
	        firstDigit = true;
	        operatelegal = true;
	    }
	 /**
	  * 从文本框中获取文本,并将文本转化为数字
	  */
	 private double getNumberFromText() {
	        double result = 0;
	        //将文本框中的内容转换成一个Double对象,然后利用Double内的方法变成double
	        try {
	            result = Double.valueOf(result_txt.getText()).doubleValue();
	        } catch (NumberFormatException e) {
	        }
	        return result;
	    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值