java计算器源码

来源:互联网 发布:解压数据错误 编辑:程序博客网 时间:2024/05/01 00:20

今天花了一个下午加一个晚上写了个计算器的小程序,用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);}@Overridepublic void actionPerformed(ActionEvent e) {String s = e.getActionCommand();if(s.equals("BackSpace")){//BackSpace功能try{if(!textField.getText().trim().equals("0.")){//如果显示屏显示的不是0if(textField.getText().trim().length()!=1){//如果缓存字符数不为1就将最后一个字符删除textField.setText(strBuff.delete(strBuff.length()-1, strBuff.length()).toString());}else{//否则设置初值为0textField.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){//如果结果是整数就去掉小数点后的无效0textField.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());}elsetextField.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();}}


计算器的界面

原创粉丝点击