湖南万树it学院官网
万树IT:制作第一个程序-计算器
更新时间:2017-09-19 16:14   来源:未知   浏览次数:  
  • 分享到:
      上一节,我们了解了项目的目录。而这一节,我们一起来做一个计算器。

一.简介

      话不多说,让我们先来看看效果图吧:

         



1.1 知识点
 
Java Swing 界面编程
 
计算器逻辑运算实现
 
1.2 实验环境介绍
 
本实验环境采用带桌面的 Ubuntu Linux 环境,实验中会用到桌面上的程序:
 
Eclipse:一个开放源代码的、基于Java的可扩展开发平台,用于 Java 程序开发。

二.实战

 整个面板用了BorderLayout布局,分为北,左和中。中部采用网格布局。定义这个类为CalFrame.java: cop
 


package calframe;  
  
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 java.util.Arrays;  
  
import javax.swing.JButton;  
import javax.swing.JFrame;  
import javax.swing.JPanel;  
import javax.swing.JTextField;  
  
public class CalFrame extends JFrame {  
    /** 
     * 计算器的外观设计 
     */  
private static final long serialVersionUID = 1L;  
private final static int PRE_WIDTH = 500;  
private final static int PRE_HEIGHT = 400;  
      
private JTextField text = null;  
private JButton button = null; //存储标记  
      
private String[] nOp = {"7","8","9","/","sqrt","4","5","6","*","%","1","2","3","-","1/x","0","+/-",".","+","="};  
private String[] mOp = {"MC","MR","MS","M+"};  
private String[] rOp = {"Back","CE","C"};  
private CalService service = new CalService();  
      
    public CalFrame(){  
        this.setTitle("计算器");  
        this.setSize(PRE_WIDTH, PRE_HEIGHT);  
        this.setLocationRelativeTo(null);  
        this.setResizable(false);  
          
        //添加底层   
        JPanel panel = new JPanel();  
        panel.setLayout(new BorderLayout(10,1));  
        panel.add(getTextField(), BorderLayout.NORTH);  
        panel.setPreferredSize(new Dimension(PRE_WIDTH, PRE_HEIGHT));  
          
        //WEST  
        JButton[] mButton = getMButton();  
        JPanel panel1 = new JPanel();  
        panel1.setLayout(new GridLayout(5,1,0,5));  
        for(JButton b : mButton ){  
            panel1.add(b);  
        }  
        panel.add(panel1,BorderLayout.WEST);  
        //  
        JButton[] rButton = getRButton();  
        JPanel panel2 = new JPanel();  
        panel2.setLayout(new BorderLayout(1,5));  
        JPanel panel21 = new JPanel();  
        panel21.setLayout(new GridLayout(1,3,3,3));  
        for(JButton b : rButton){  
            panel21.add(b);  
        }  
        panel2.add(panel21,BorderLayout.NORTH);  
          
        JButton[] nButton = getNButton();  
        JPanel panel22 = new JPanel();  
        panel22.setLayout(new GridLayout(4,5,3,5));  
        for(JButton b : nButton){  
            panel22.add(b);  
        }  
        panel2.add(panel22,BorderLayout.CENTER);  
        panel.add(panel2,BorderLayout.CENTER);  
          
        this.add(panel);  
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);  
        this.setVisible(true);  
  
          
    }  
    //返回显示框  
    private JTextField getTextField(){  
        text = new JTextField("0",10);  
        //text.setSize(480, 50);  
        return text;  
    }  
    //返回数字键  
    private JButton[] getNButton(){  
        String[] redButton = {"/","*","-","+","="};  
        JButton[] nbutton = new JButton[nOp.length];  
        for(int i = 0; i < this.nOp.length; i++){  
            JButton b = new JButton(this.nOp[i]);  
            b.addActionListener(getActionListener());  
              
            Arrays.sort(redButton);  
            if(Arrays.binarySearch(redButton, nOp[i]) >= 0){  
                b.setForeground(Color.red);  
            }else{  
                b.setForeground(Color.blue);  
            }  
            nbutton[i] = b;  
        }  
        return nbutton;  
    }  
    //返回操作健  
    private JButton[] getMButton(){  
        JButton[] mbutton = new JButton[mOp.length + 1];  
        mbutton[0] = getButton();  
        for(int i = 0; i < this.mOp.length; i++){  
            JButton b = new JButton(this.mOp[i]);  
            b.addActionListener(getActionListener());  
            b.setForeground(Color.red);  
            mbutton[i+1] = b;  
        }  
        return mbutton;  
    }  
    private JButton[] getRButton(){  
        JButton[] rbutton = new JButton[rOp.length];  
        for(int i = 0; i < this.rOp.length; i++){  
            JButton b = new JButton(this.rOp[i]);  
            b.addActionListener(getActionListener());  
            b.setForeground(Color.red);  
            rbutton[i] = b;  
        }  
        return rbutton;  
    }  
    private JButton getButton(){  
        button = new JButton();  
        return button;  
    }  
    private ActionListener getActionListener(){  
        ActionListener actionListener = new ActionListener() {  
              
            @Override  
            public void actionPerformed(ActionEvent e) {  
                String cmd = e.getActionCommand();  
                String result = null;  
                try {  
                    result = service.callMethod(cmd, text.getText());  
                } catch (Exception e2) {  
                    System.out.println(e2.getMessage());  
                }  
                if(cmd.indexOf("MC") == 0){  
                    button.setText("");  
                }else if(cmd.indexOf("M") == 0){  
                    button.setText("M");  
                }  
                //显示计算结果  
                if(result != null){  
                    text.setText(result);  
                }  
              
            }  
        };   
        return actionListener;  
    }  
    public static void main(String[] args) {  
        new CalFrame();  
    }  
}
 

 

接下来就是实现,加,减,乘,除等功能。考虑到精度和范围的问题,我们定义了一个MyMath类,数据格式都使用BigDecimal对象进行计算。MyMath.java:

 

package calframe;  
  
import java.math.BigDecimal;  
  
public class MyMath {  
    /** 
     * 为一个double类型创建BigDecimal对象 
     */  
    private static BigDecimal getBigDecimal(double number){  
        return new BigDecimal(number);  
    }  
    public static double add(double num1, double num2) {  
        BigDecimal first = getBigDecimal(num1);  
        BigDecimal second = getBigDecimal(num2);  
        return first.add(second).doubleValue();  
    }  
    public static double subtract(double num1, double num2) {  
        BigDecimal first = getBigDecimal(num1);  
        BigDecimal second = getBigDecimal(num2);  
        return first.subtract(second).doubleValue();  
    }     
    public static double multiply(double num1, double num2) {  
        BigDecimal first = getBigDecimal(num1);  
        BigDecimal second = getBigDecimal(num2);  
        return first.multiply(second).doubleValue();  
    }     
    public static double divide(double num1, double num2) {  
        BigDecimal first = getBigDecimal(num1);  
        BigDecimal second = getBigDecimal(num2);  
        return first.divide(second,3,BigDecimal.ROUND_HALF_UP).doubleValue();  
    }  
}  

 
最后处理按钮的事件,我们定义了一个CalService类处理业务逻辑


package calframe;  
  
public class CalService {  
    private boolean isSecondNum = false;  
    private String lastOp;  
    private String firstNum = "0";  
    private String secondNum = "null";  
    private double store;  
    private String numString = "0123456789.";  
    private String opString = "+-*/";  
  
    public String catNum(String cmd, String text) {  
        String result = cmd;  
        // 如果text不等于0  
        if (!"0".equals(text)) {  
            if (isSecondNum) {  
                isSecondNum = false;  
            } else {  
                result = text + cmd;  
            }  
        }  
        if (result.indexOf(".") == 0) {  
            result = "0" + result;  
        }  
        return result;  
    }  
  
    public String setOp(String cmd, String text) {  
        this.lastOp = cmd;  
        this.firstNum = text;  
        this.secondNum = null;  
  
        this.isSecondNum = true;  
        return null;  
    }  
  
    public String cal(String text, boolean isPercent) {  
        double secondResult = secondNum == null ? Double.valueOf(text)  
                .doubleValue() : Double.valueOf(secondNum).doubleValue();  
                  
        //除数为0  
        if(secondResult == 0 && this.lastOp.equals("/")){  
            return "0";  
        }  
          
        //有%  
        if(isPercent){  
            secondResult = MyMath.multiply(Double.valueOf(firstNum), MyMath.divide(secondResult, 100));  
        }  
        if(this.lastOp.equals("+")){  
            firstNum = String.valueOf(MyMath.add(Double.valueOf(firstNum),secondResult));  
        }else if (this.lastOp.equals("-")) {  
            firstNum = String.valueOf(MyMath.subtract(Double.valueOf(firstNum),secondResult));  
        }else if (this.lastOp.equals("*")) {  
            firstNum = String.valueOf(MyMath.multiply(Double.valueOf(firstNum),secondResult));  
        }else if (this.lastOp.equals("/")) {  
            firstNum = String.valueOf(MyMath.divide(Double.valueOf(firstNum),secondResult));  
        }  
          
        secondNum = secondNum == null ? text :secondNum;  
        this.isSecondNum = true;  
        return firstNum;  
    }  
    //求开方  
    public String sqrt(String text){  
        this.isSecondNum = true;  
        return String.valueOf(Math.sqrt(Double.valueOf(text)));  
    }  
    //求倒数  
    public String setReciprocal(String text){  
        if (text.equals("0")){  
            return text;  
        }else{  
            this.isSecondNum = true;  
            return String.valueOf(MyMath.divide(1, Double.valueOf(text)));  
        }  
    }  
    //存储  
    public String mCmd(String cmd,String text){  
        if(cmd.equals("M+")){  
            store = MyMath.add(store, Double.valueOf(text));  
        }else if (cmd.equals("MC")) {  
            store = 0;  
        }else if (cmd.equals("MR")) {  
            isSecondNum = true;  
            return String.valueOf(store);  
        }else if (cmd.equals("MS")) {  
            store = Double.valueOf(text).doubleValue();  
        }  
        return null;  
    }  
      
    public String backSpace(String text){  
        return text.equals("0") || text.equals("") ? "0" :text.substring(0,text.length()-1);  
    }  
      
    public String setNegative(String text){  
        if(text.indexOf("-") == 0){  
            return text.substring(1,text.length());  
        }else{  
            return "-" + text;  
        }  
    }  
    public String clearAll(){  
        this.firstNum = "0";  
        this.secondNum = null;  
        return this.firstNum;  
    }  
    public String clear(String text){  
        return "0";  
    }  
      
    public String callMethod(String cmd, String text){  
        if(cmd.equals("C")){  
            return clearAll();  
        }else if(cmd.equals("CE")){  
            return clear(text);  
        }else if (cmd.equals("Back")) {  
            return backSpace(text);  
        }else if (numString.indexOf(cmd) != -1) {  
            return catNum(cmd, text);  
        }else if (opString.indexOf(cmd) != -1) {  
            return setOp(cmd, text);  
        }else if (cmd.equals("+/-")) {  
            return setNegative(text);  //设置正负号  
        }else if(cmd.equals("1/x")){  
            return setReciprocal(text);  
        }else if (cmd.equals("sqrt")) {  
            return sqrt(text);  
        }else if(cmd.equals("%")){  
            return cal(text, true);  
        }else if(cmd.equals("=")){  
            return cal(text, false);  
        }else {  
            return mCmd(cmd, text);  
        }  
    }  
}  

 
最后的calMethod方法大量使用if else判断不是好的实现方法,感兴趣的可以看看java的设计模式,消除这样的判断。

至此,一个简易的计算器就完成了。
  • 分享到:

联系我们

万树IT软件学院地图导航

如有问题,可在线提交表单

  • 提交后,我们的老师会及时为您回复

© 2017 www.wanshuit.com 湖南万树信息技术有限公司 版权所有 丨 备案号:湘ICP备16021152号

友情链接:湖南万树IT学院 sem软件 模特培训 重庆网站优化 万树XML地图 顺德网络公司 遴选 成都小程序 天津化妆培训 杭州翻译公司