您的位置:首页 > 编程语言 > Java开发

Java计算器

2015-07-20 15:20 661 查看
自己有时候突发感想想做个小玩意出来就会着迷,想方设法的自己做出来。前几天做了个还算可以的计算器。

public class CalculatorMainClass  {
      public static void main(String args[]) {
          CalculatorFrame Calculator=new CalculatorFrame();
          Calculator.setBounds(0,0,360,300);
          Calculator.setVisible(true);
      }
}
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;
import javax.swing.JTextField;

import java.awt.Font;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

public class CalculatorFrame extends JFrame implements ActionListener {
    private static final long serialVersionUID = 1L;
    JButton CE=new JButton("CE");
    JTextField  TextField=new JTextField();
    String[] str={"7","8","9","/","4","5","6","*","1","2","3","-",".","0","=","+"}; 
    JButton[] Buttons=new JButton[str.length];
    StringBuffer strBuffer=new StringBuffer();
    public CalculatorFrame(){
        super("计算器-屠柯");
        JPanel Panel=new JPanel(new BorderLayout());
        TextField.setFont(new Font("宋体", Font.PLAIN, 40));
        TextField.setEditable(false);       TextField.setHorizontalAlignment(JTextField.RIGHT);//设置水平对其方式为右侧    
        CE.setFont(new Font("宋体", Font.BOLD, 20));
        CE.setActionCommand("clear");
        CE.addActionListener(this);
        Panel.add("Center",TextField);
        Panel.add("East",CE);
        //把按钮加入画板
        JPanel Panel1 = new JPanel(new GridLayout(4, 4));         
           for (int i = 0; i < str.length; i++) {              
               Buttons[i] = new JButton(str[i]);
               Buttons[i].setFont(new Font("宋体", Font.BOLD, 20));
               Panel1.add(Buttons[i]);
           }
          //每个按钮设置监听器
        for(int i=0;i<str.length;i++){
            Buttons[i].addActionListener(this);
            if(Buttons[i].getText().equals("=")){
                Buttons[i].setActionCommand("equal");
            }
            else {
                Buttons[i].setActionCommand("common");
            }
        }       
         getContentPane().setLayout(new BorderLayout());
         getContentPane().add("North", Panel);
         getContentPane().add("Center", Panel1);
    }
    @Override
    public void actionPerformed(ActionEvent e) {

        if(e.getActionCommand().equals("common")){

            JButton b=(JButton)e.getSource();           
            strBuffer.append(b.getText());
            TextField.setText(strBuffer.toString());
            TextField.repaint();//刷新界面
        }
        else if(e.getActionCommand().equals("equal")){

             DecimalFormat df = new DecimalFormat(",##0.00"); 
              String s=df.format(ComputerNum(strBuffer.toString()));//将sum保留两位小数

             TextField.setText(s);
             strBuffer.delete(0,strBuffer.length());//strBuffer清空
             TextField.repaint();
        }
        else if(e.getActionCommand().equals("clear")){
            strBuffer.delete(0,strBuffer.length());//strBuffer清空
            TextField.setText("0");
        }

    }
    //计算输入值
    public Double ComputerNum(String text){
         // 计算内容按符号分割         
        List<String> numList = new ArrayList<String>();  
        int splitIndex = 0;  
        for(int i=0;i<text.length();i++){  
            char c = text.charAt(i);  
            if(c == '+'||c == '-'||c=='*'||c=='/'){  
                numList.add(text.substring(splitIndex, i));  
                numList.add(c+"");  
                splitIndex = i+1;  
            }  
        }  
        // 因为使用符号做判断,增加前一位和符号,所以最后一位数字不会在循环里处理  
        numList.add(text.substring(splitIndex, text.length()));  

       /* System.out.println("====分割后====");  
        for(int i=0;i<numList.size();i++){  
            System.out.println(i + " -> " + numList.get(i));  
        }  */         
        // 先做乘除计算  
        List<String> list = new ArrayList<String>();  
        Double temp = null; // 用于做乘除计算临时变量  
        for(int i=1;i<numList.size();i+=2){ // 这里只循环运算符号  
            if("+".equals(numList.get(i))||"-".equals(numList.get(i))){  
                if(null != temp){ // 存在临时变量,说明前面进行过乘除计算  
                    list.add(temp.toString());  
                    temp = null;  
                } else {  
                    list.add(numList.get(i-1));  
                }  
                list.add(numList.get(i)); // 把符号加进去  
                if(i==numList.size()-2) { // 处理到最后时遇到直接处理  

                    list.add(numList.get(i+1));  
                 }  
            }else if("*".equals(numList.get(i))){  
                if(null == temp){  
                    temp = Double.parseDouble(numList.get(i-1)) * Double.parseDouble(numList.get(i+1));  
                }else{  
                    temp = temp * Integer.parseInt(numList.get(i+1));  
                }  
                if(i==numList.size()-2) { // 处理到最后时遇到直接处理  
                    list.add(temp.toString());  
                    temp = null;  
                }  
            }else if("/".equals(numList.get(i))){  
                if(null == temp){  
                    temp = Double.parseDouble(numList.get(i-1)) /Double.parseDouble(numList.get(i+1));  
                }else{  
                    temp = temp / Double.parseDouble(numList.get(i+1));  
                }  
                if(i==numList.size()-2) { // 处理到最后时遇到直接处理  
                    list.add(temp.toString());  
                    temp = null;  
                }  
            }  
        }  
        /*System.out.println("====乘除后====");  
        for(int i=0;i<list.size();i++){  
            System.out.println(i + " -> " + list.get(i));  
        }  */

        // 再做加减计算  
        Double sum = Double.parseDouble(list.get(0)); // 第一位不会在循环里处理  
        for(int i=1;i<list.size();i+=2){ // 这里只循环运算符号  
            if("+".equals(list.get(i))){  
                sum += Integer.parseInt(list.get(i+1));  
            }else if("-".equals(list.get(i))){  
                sum -= Integer.parseInt(list.get(i+1));  
            }  
        }  

        return sum;

    }

}


结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: