Java版本JFrame,计算器和单位换算的实现

  1. 创建计算类
    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    /**
     * 一个计算器,与Windows附件自带计算器的标准版功能、界面相仿。 但还不支持键盘操作。
     */
    public class Calculator {
    	//计算器按钮显示文本
    	String[] btntext= {"MC", "MR", "MS", "M+", "%", "√", "x^2", "1/x", "CE", "C", "Bak", "÷",
    			"7", "8", "9", "x", "4", "5", "6", "-", "1", "2", "3", "+",
    			"+/-", "0", ".", "=",};
    	//放置结果文本域
    	JTextField resultText=new JTextField();
    	// 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字
        private boolean firstDigit = true;
        // 计算的中间结果。
        private double resultNum = 0.0;
        // 当前运算的运算符
        private String operator = "=";
        // 操作是否合法
        private boolean operateValidFlag = true;
    	/**
    	 * 获取计算器面板
    	 * @return 计算器面板
    	 */
    	public JPanel getCalculator() {
    		JPanel jp=new JPanel();
    		jp.setLayout(new BorderLayout());//设置布局
    		
    		resultText.setText("0");
    		jp.add(resultText, BorderLayout.NORTH);
    		//放置所有操作按钮
    		JPanel opt=new JPanel();
    		opt.setLayout(new GridLayout(7, 4));
    		for(String str : btntext) {
    			JButton btn=new JButton(str);
    			btn.addActionListener(new ActionListener() {
    				@Override
    				public void actionPerformed(ActionEvent e) {
    					// 获取事件源的标签
    			        String label = e.getActionCommand();
    			        if (label.equals("Bak")) {
    			            // 用户按了"Backspace"键
    			            handleBackspace();
    			        } else if (label.equals("CE")) {
    			            // 用户按了"CE"键
    			            resultText.setText("0");
    			        } else if (label.equals("C")) {
    			            // 用户按了"C"键
    			            handleC();
    			        } else if ("0123456789.".indexOf(label) >= 0) {
    			            // 用户按了数字键或者小数点键
    			            handleNumber(label);
    			            // handlezero(zero);
    			        } else {
    			            // 用户按了运算符键
    			            handleOperator(label);
    			        }
    				}
    			});
    			opt.add(btn);
    		}
    		jp.add(opt, BorderLayout.CENTER);
    		return jp;
    	}
     
        /**
         * 处理Backspace键被按下的事件
         */
        private void handleBackspace() {
            String text = resultText.getText();
            int i = text.length();
            if (i > 0) {
                // 退格,将文本最后一个字符去掉
                text = text.substring(0, i - 1);
                if (text.length() == 0) {
                    // 如果文本没有了内容,则初始化计算器的各种值
                    resultText.setText("0");
                    firstDigit = true;
                    operator = "=";
                } else {
                    // 显示新的文本
                    resultText.setText(text);
                }
            }
        }
     
        /**
         * 处理数字键被按下的事件
         *
         * @param key
         */
        private void handleNumber(String key) {
            if (firstDigit) {
                // 输入的第一个数字
                resultText.setText(key);
            } else if ((key.equals(".")) && (resultText.getText().indexOf(".") < 0)) {
                // 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面
                resultText.setText(resultText.getText() + ".");
            } else if (!key.equals(".")) {
                // 如果输入的不是小数点,则将数字附在结果文本框的后面
                resultText.setText(resultText.getText() + key);
            }
            // 以后输入的肯定不是第一个数字了
            firstDigit = false;
        }
     
        /**
         * 处理C键被按下的事件
         */
        private void handleC() {
            // 初始化计算器的各种值
            resultText.setText("0");
            firstDigit = true;
            operator = "=";
        }
     
        /**
         * 处理运算符键被按下的事件
         *
         * @param key
         */
        private void handleOperator(String key) {
            if (operator.equals("÷")) {
                // 除法运算
                // 如果当前结果文本框中的值等于0
                if (getNumberFromText() == 0.0) {
                    // 操作不合法
                    operateValidFlag = false;
                    resultText.setText("除数不能为零");
                } else {
                    resultNum /= getNumberFromText();
                }
            } else if (operator.equals("1/x")) {
                // 倒数运算
                if (resultNum == 0.0) {
                    // 操作不合法
                    operateValidFlag = false;
                    resultText.setText("零没有倒数");
                } else {
                    resultNum = 1 / resultNum;
                }
            } else if (operator.equals("+")) {
                // 加法运算
                resultNum += getNumberFromText();
            } else if (operator.equals("-")) {
                // 减法运算
                resultNum -= getNumberFromText();
            } else if (operator.equals("x")) {
                // 乘法运算
                resultNum *= getNumberFromText();
            }else if (operator.equals("x^2")) {
            	resultNum *= resultNum;
            } else if (operator.equals("√")) {
                // 平方根运算
                resultNum = Math.sqrt(resultNum);
            } else if (operator.equals("%")) {
                // 百分号运算,除以100
                resultNum = resultNum / 100;
            } else if (operator.equals("+/-")) {
                // 正数负数运算
                resultNum = resultNum * (-1);
            } else if (operator.equals("=")) {
                // 赋值运算
                resultNum = getNumberFromText();
            }
            if (operateValidFlag) {
                // 双精度浮点数的运算
                long t1;
                double t2;
                t1 = (long) resultNum;
                t2 = resultNum - t1;
                if (t2 == 0) {
                    resultText.setText(String.valueOf(t1));
                } else {
                    resultText.setText(String.valueOf(resultNum));
                }
            }
            // 运算符等于用户按的按钮
            operator = key;
            firstDigit = true;
            operateValidFlag = true;
        }
     
        /**
         * 从结果文本框中获取数字
         *
         * @return
         */
        private double getNumberFromText() {
            double result = 0;
            try {
                result = Double.valueOf(resultText.getText()).doubleValue();
            } catch (NumberFormatException e) {
            }
            return result;
        }
    }

     

  2. 创建单位换算
    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.regex.Pattern;
    
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.JToolBar;
    
    public class Convert {
    
    	private static Map toolbarmap = new HashMap();
    	private static String[][] conrate=null;
    	private static JLabel jl=new JLabel();//显示标题
    	private static JComboBox convert=new JComboBox();
    	private static JComboBox converted=new JComboBox();
    	private static JTextField tconvert=new JTextField();
    	private static JTextField tconverted=new JTextField();
    
    	static {
    		tconverted.setEditable(false);
    		/*
    		 * 		厘米		分米		米		千米(输入项)
    		 * 厘米	1		10		100		100000
    		 * 分米	0.1		1		10		10000
    		 * 米	0.01	0.1		1		1000
    		 * 千米	0.00001	0.0001	0.001	1
    		 */
    		String[][] len = new String[4][5];
    		len[0] = new String[5];
    		len[1] = new String[5];
    		len[2] = new String[5];
    		len[3] = new String[5];
    		len[0][0]="厘米";
    		len[1][0]="分米";
    		len[2][0]="米";
    		len[3][0]="千米";
    		len[0][1]="1";
    		len[1][1]="10";
    		len[2][1]="100";
    		len[3][1]="100000";
    		len[0][2]="0.1";
    		len[1][2]="1";
    		len[2][2]="10";
    		len[3][2]="10000";
    		len[0][3]="0.01";
    		len[1][3]="0.1";
    		len[2][3]="1";
    		len[3][3]="1000";
    		len[0][4]="0.00001";
    		len[1][4]="0.0001";
    		len[2][4]="0.001";
    		len[3][4]="1";
    		toolbarmap.put("长度(L)", len);
    		/*
    		 * 			平方厘米		平方分米		平方米(输入项)
    		 * 平方厘米	1			100			10000	
    		 * 平方分米	0.01		1			100	
    		 * 平方米	0.0001		0.01		1	
    		 */
    		String[][] area = new String[3][4];
    		area[0] = new String[4];
    		area[1] = new String[4];
    		area[2] = new String[4];
    		area[0][0]="平方厘米";
    		area[1][0]="平方分米";
    		area[2][0]="平方米";
    		area[0][1]="1";
    		area[1][1]="100";
    		area[2][1]="10000";
    		area[0][2]="0.01";
    		area[1][2]="1";
    		area[2][2]="100";
    		area[0][3]="0.0001";
    		area[1][3]="0.01";
    		area[2][3]="1";
    		toolbarmap.put("面积(S)", area);
    		/*
    		 * 			立方厘米		立方分米		立方米(输入项)
    		 * 立方厘米	1			1000		100000	
    		 * 立方分米	0.001		1			1000	
    		 * 立方米	0.000001	0.001		1	
    		 */
    		String[][] vol = new String[3][4];
    		vol[0] = new String[4];
    		vol[1] = new String[4];
    		vol[2] = new String[4];
    		vol[0][0]="立方厘米";
    		vol[1][0]="立方分米";
    		vol[2][0]="立方米";
    		vol[0][1]="1";
    		vol[1][1]="1000";
    		vol[2][1]="1000000";
    		vol[0][2]="0.001";
    		vol[1][2]="1";
    		vol[2][2]="1000";
    		vol[0][3]="0.000001";
    		vol[1][3]="0.001";
    		vol[2][3]="1";
    		toolbarmap.put("体积(V)", vol);
    		/*
    		 * 			摄氏度		华氏度		开尔文(输入项)
    		 * 摄氏度	1			-17.2222	-272.15	
    		 * 华氏度	33.8		1			-475.87	
    		 * 开尔文	274.15		255.9278	1	
    		 */
    		String[][] temperature = new String[3][4];
    		temperature[0] = new String[4];
    		temperature[1] = new String[4];
    		temperature[2] = new String[4];
    		temperature[0][0]="摄氏度";
    		temperature[1][0]="华氏度";
    		temperature[2][0]="开尔文";
    		temperature[0][1]="1";
    		temperature[1][1]="-17.2222";
    		temperature[2][1]="-272.15";
    		temperature[0][2]="33.8";
    		temperature[1][2]="1";
    		temperature[2][2]="-475.87";
    		temperature[0][3]="274.15";
    		temperature[1][3]="255.9278";
    		temperature[2][3]="1";
    		toolbarmap.put("温度(K)", temperature);
    		/*
    		 * 			焦耳			千焦耳		卡路里(输入项)
    		 * 焦耳		1			1000		4.184	
    		 * 千焦耳	0.001		1			0.004184	
    		 * 卡路里	0.239006	239.0057	1	
    		 */
    		String[][] heat = new String[3][4];
    		heat[0] = new String[4];
    		heat[1] = new String[4];
    		heat[2] = new String[4];
    		heat[0][0]="焦耳";
    		heat[1][0]="千焦耳";
    		heat[2][0]="卡路里";
    		heat[0][1]="1";
    		heat[1][1]="1000";
    		heat[2][1]="4.184";
    		heat[0][2]="0.001";
    		heat[1][2]="1";
    		heat[2][2]="0.004184";
    		heat[0][3]="0.239006";
    		heat[1][3]="239.0057";
    		heat[2][3]="1";
    		toolbarmap.put("能量(Q)", heat);
    		/*
    		 * 			度			弧度			百分度(输入项)
    		 * 度		1			57.29578	0.9	
    		 * 弧度		0.017453	1			0.015708	
    		 * 百分度	1.111111	63.66198	1	
    		 */
    		String[][] ang = new String[3][4];
    		ang[0] = new String[4];
    		ang[1] = new String[4];
    		ang[2] = new String[4];
    		ang[0][0]="度";
    		ang[1][0]="弧度";
    		ang[2][0]="百分度";
    		ang[0][1]="1";
    		ang[1][1]="57.29578";
    		ang[2][1]="0.9";
    		ang[0][2]="0.017453";
    		ang[1][2]="1";
    		ang[2][2]="0.015708";
    		ang[0][3]="1.111111";
    		ang[1][3]="63.66198";
    		ang[2][3]="1";
    		toolbarmap.put("角度(A)", ang);
    		/*
    		 * 			厘米/秒		米/秒		公里/小时(输入项)
    		 * 厘米/秒	1			100			27.7777777
    		 * 米/秒		0.01		1			0.2777777	
    		 * 公里/小时	0.036		3.6			1	
    		 */
    		String[][] career = new String[3][4];
    		career[0] = new String[4];
    		career[1] = new String[4];
    		career[2] = new String[4];
    		career[0][0]="厘米/秒";
    		career[1][0]="米/秒";
    		career[2][0]="公里/小时";
    		career[0][1]="1";
    		career[1][1]="100";
    		career[2][1]="27.7777777";
    		career[0][2]="0.01";
    		career[1][2]="1";
    		career[2][2]="0.2777777";
    		career[0][3]="0.036";
    		career[1][3]="3.6";
    		career[2][3]="1";
    		toolbarmap.put("速度(R)", career);
    		/*
    		 * 		巴		帕		千帕(输入项)
    		 * 巴	1		0.00001	0.01
    		 * 帕	100000	1		1000
    		 * 千帕	100		0.001	1
    		 */
    		String[][] press = new String[3][4];
    		press[0] = new String[4];
    		press[1] = new String[4];
    		press[2] = new String[4];
    		press[0][0]="巴";
    		press[1][0]="帕";
    		press[2][0]="千帕";
    		press[0][1]="1";
    		press[1][1]="0.00001";
    		press[2][1]="0.01";
    		press[0][2]="100000";
    		press[1][2]="1";
    		press[2][2]="1000";
    		press[0][3]="100";
    		press[1][3]="0.001";
    		press[2][3]="1";
    		toolbarmap.put("压力(P)", press);
    		/*
    		 * 		克			千克			吨			磅(输入项)
    		 * 克	1			1000		1000000		453.5924
    		 * 千克	0.001		1			1000		0.453592
    		 * 吨	0.000001	0.001		1			0.000454
    		 * 磅	0.002205	2.204623	2204.623	1
    		 */
    		String[][] qua = new String[4][5];
    		qua[0] = new String[5];
    		qua[1] = new String[5];
    		qua[2] = new String[5];
    		qua[3] = new String[5];
    		qua[0][0]="克";
    		qua[1][0]="千克";
    		qua[2][0]="吨";
    		qua[3][0]="磅";
    		qua[0][1]="1";
    		qua[1][1]="1000";
    		qua[2][1]="1000000";
    		qua[3][1]="453.5924";
    		qua[0][2]="0.001";
    		qua[1][2]="1";
    		qua[2][2]="1000";
    		qua[3][2]="0.453592";
    		qua[0][3]="0.000001";
    		qua[1][3]="0.001";
    		qua[2][3]="1";
    		qua[3][3]="0.000454";
    		qua[0][4]="0.002205";
    		qua[1][4]="2.204623";
    		qua[2][4]="2204.623";
    		qua[3][4]="1";
    		toolbarmap.put("重量(M)", qua);
    		/*
    		 * 		瓦特			千瓦			马力(输入项)
    		 * 瓦特	1			1000		745.6999
    		 * 千瓦	0.001		1			0.7457
    		 * 马力	0.001341022	1.341022	1
    		 */
    		String[][] ele = new String[3][4];
    		ele[0] = new String[4];
    		ele[1] = new String[4];
    		ele[2] = new String[4];
    		ele[0][0]="瓦特";
    		ele[1][0]="千瓦";
    		ele[2][0]="马力";
    		ele[0][1]="1";
    		ele[1][1]="1000";
    		ele[2][1]="745.6999";
    		ele[0][2]="0.001";
    		ele[1][2]="1";
    		ele[2][2]="0.7457";
    		ele[0][3]="0.001341022";
    		ele[1][3]="1.341022";
    		ele[2][3]="1";
    		toolbarmap.put("功率(W)", ele);
    		/*
    		 * 			元			美元			欧元(输入项)
    		 * 元		1			6.91		7.81
    		 * 美元		0.14		1			1.13
    		 * 欧元		0.13		0.88		1
    		 */
    		String[][] dol = new String[3][4];
    		dol[0] = new String[4];
    		dol[1] = new String[4];
    		dol[2] = new String[4];
    		dol[0][0]="元";
    		dol[1][0]="美元";
    		dol[2][0]="欧元";
    		dol[0][1]="1";
    		dol[1][1]="6.91";
    		dol[2][1]="7.81";
    		dol[0][2]="0.14";
    		dol[1][2]="1";
    		dol[2][2]="1.13";
    		dol[0][3]="0.13";
    		dol[1][3]="0.88";
    		dol[2][3]="1";
    		toolbarmap.put("货币(¥)", dol);
    	}
    	/**
    	 * 获取计算器面板
    	 * 
    	 * @return 计算器面板
    	 */
    	public JPanel getConvert() {
    		JPanel jp = new JPanel();
    		jp.setLayout(new BorderLayout());// 设置布局
    		JToolBar jtb = new JToolBar();
    		jtb.setFloatable(true);
    		//jtb.setOrientation(SwingConstants.HORIZONTAL);
    		for (String str : toolbarmap.keySet()) {
    			JButton jb = new JButton(str);
    			jb.addActionListener(new ActionListener() {
    				@Override
    				public void actionPerformed(ActionEvent e) {
    					setopcentext(str);
    				}
    			});
    			jtb.add(jb);
    		}
    		jp.add(jtb, BorderLayout.NORTH);
    		//添加中央显示面板
    		setopcentext("长度(L)");
    		JPanel center=new JPanel();
    		center.setLayout(new GridLayout(6, 1));
    		center.add(jl);
    		center.add(convert);
    		center.add(tconvert);
    		center.add(converted);
    		center.add(tconverted);
    		//单位换算提交按钮
    		JButton sure=new JButton("确定");
    		//添加点击事件监听事件
    		sure.addActionListener(new ActionListener() {
    			@Override
    			public void actionPerformed(ActionEvent arg0) {
    				double rate=Double.parseDouble(conrate[convert.getSelectedIndex()][converted.getSelectedIndex()+1]);
    				String in=tconvert.getText();
    				String pattern = "^(\\-|\\+)?\\d+(\\.\\d+)?$";
    				double i=0.0;
    				if(Pattern.matches(pattern, in)) {
    					i=Double.parseDouble(in);
    					tconverted.setText(Double.toString(rate*i));
    				}else tconverted.setText("请输入正确的数字格式");
    			}
    		});
    		center.add(sure, BorderLayout.SOUTH);
    		jp.add(center);
    		return jp;
    	}
    	/**
    	 * 设置操作项文本,下拉选项等
    	 * @param type 操作类型  长度等
    	 */
    	private void setopcentext(String type) {
    		convert.removeAllItems();
    		converted.removeAllItems();
    		conrate=toolbarmap.get(type);
    		jl.setText(type);
    		for(String[] s : conrate) {
    			convert.addItem(s[0]);
    			converted.addItem(s[0]);
    		};
    	}
    }

     

  3. 启动类
    import java.awt.BorderLayout;
    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.JPanel;
    
    public class MyCalculator extends JFrame {
    	private static final long serialVersionUID = 1L;
    
    	public MyCalculator() {
    		super("计算器");
    		JFrame jframe=this;
    		this.setLayout(new BorderLayout());
    		//添加计算器面板
    		JPanel pcal=new Calculator().getCalculator();
    		JPanel pcon=new Convert().getConvert();
    		this.getContentPane().add(pcal, BorderLayout.CENTER);
    		//this.getContentPane().add(pcon, BorderLayout.CENTER);
    		//计算器,单位转换操作按钮
    		JPanel btn=new JPanel();
    		btn.setLayout(new GridLayout(1, 2));
    		JButton cal=new JButton("计算器");
    		cal.addActionListener(new ActionListener() {
    			@Override
    			public void actionPerformed(ActionEvent arg0) {
    				pcon.setVisible(false);
    				pcal.setVisible(true);
    				jframe.getContentPane().add(pcal, BorderLayout.CENTER);
    			}
    		});
    		JButton con=new JButton("单位转换");
    		con.addActionListener(new ActionListener() {
    			@Override
    			public void actionPerformed(ActionEvent arg0) {
    				pcon.setVisible(true);
    				pcal.setVisible(false);
    				jframe.getContentPane().add(pcon, BorderLayout.CENTER);
    			}
    		});
    		btn.add(cal);
    		btn.add(con);
    		this.add(btn, BorderLayout.SOUTH);
    		//设置窗体属性
    		this.setVisible(true);
    		this.setBounds(100, 100, 634, 300);//设置窗体的位置和大小
    	}
    	public static void main(String[] args) {
    		new MyCalculator();
    	}
    }

    好了,完成了,欢迎加群QQ讨论 517413713

你可能感兴趣的:(java,小工具)