设计内容:设计一个图形界面(GUI)的计算器应用程序,完成简单的算术运算、

设计要求:设计的计算器应用程序可以完成加法、减法、乘法、除法和取余运算。且有小数点、正负号、求倒数、退格和清零功能。

设计效果:

java计算器的工作原理 java计算器程序设计_python

 

键钮含义:

C     清零,

D     求导数,

√    求平方根,

%     求余,

<<<   退格,

(+/-)  正负号

+-*÷  四则运算

代码实现:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class Calculator extends JFrame {
    private static final long serialVersionUID = -1047298397568411277L;
    private JTextField textField;
    private ActionListener myListener;    
    public Calculator() {    
        setTitle("很low的计算器"); // 设置名字为计算器
        setSize(350, 400); // 设置大下为 300x300
        setLocationRelativeTo(null); // 设置位置为居中
        setResizable(false); // 设置为大小不可变的
        setDefaultCloseOperation(EXIT_ON_CLOSE); // 可以退出        
        Container container = getContentPane(); // 新建一个容器
        container.setLayout(new BorderLayout(5, 5)); // 设置左右间距为5像素
        JPanel pnlNorth = new JPanel();  // 北面面板
        JPanel pnlCenter = new JPanel();  // 中间面板

        // 把textFeild和panel 都放到容器上
        container.add(pnlNorth, BorderLayout.NORTH); // 把pnlNorth放在北面
        container.add(pnlCenter, BorderLayout.CENTER); // 把pnlCenter放在center面        
        textField = new JTextField();  // 文本框设置
        textField.setFont(new Font("宋体", Font.PLAIN, 25));
        textField.setEditable(false);  // 不可修改
        textField.setHorizontalAlignment (JTextField.RIGHT); //设置输出右对齐
        
        //---------------
        pnlNorth.setLayout(new BorderLayout(5, 5)); // 设置上边的文本框和按钮的位置为边界布局
        //---------------
        
        JButton btnClear1 = useButton("<<<"); // new一个button按钮
        JButton btnClear2 = useButton("(+/-)");
        pnlNorth.add(textField, BorderLayout.CENTER); // 将文本框放到中间
        pnlNorth.add(btnClear1, BorderLayout.EAST); // 将按钮放到做左边(西)
        pnlNorth.add(btnClear2, BorderLayout.WEST);
        String[] titles = {
                "7", "8", "9", "C", "+", 
                "4", "5", "6", "%", "-",
                "1", "2", "3", "√", "×",
                "0", ".", "=", "D", "÷"
        };
        
        // 设置下面放按钮的位置的panel为网格布局
        // 4x5的网格 button与button之间的距离为5像素
        pnlCenter.setLayout(new GridLayout(4, 5, 5, 5));
        for (int i = 0; i < titles.length; i++) {
            JButton btnNum = useButton(titles[i]);
            // btnNum.setFont(new Font("宋体", Font.PLAIN, 16));
            // 三个参数分别表示: 字体,样式(粗体,斜体等),字号
            btnNum.setFont(new Font("微软雅黑",Font.PLAIN, 24));
            pnlCenter.add(btnNum);
        }
       
    }
    
    public JButton useButton (final String titles) {
        /*
         * String.valueof(x)  返回x的字符串表示
         * 这里的titles之所以要用final修饰 是为了不被修改
         * 然后后面使用String的valueof方法是为了将
         */
        JButton button = new JButton(String.valueOf(titles));
        if(myListener == null){
            myListener = new ActionListener(){
                public void actionPerformed(ActionEvent event){
                      String  btnInformation  = event.getActionCommand();
                    char key2 = btnInformation.charAt(0);
                    action(key2);
                }
            };
        }
        button.addActionListener(myListener);
        
        return button;
    }
    
    int len;
    String a, b, value; 
    char exit = '0'; // 初始化为=进入的时候避免多次进入case '=': 出错 ,在使用完之后置为=
    char op = 'n'; // 最听话的op 始终指向前一个操作符  这里的=是逻辑意义上的得到运算结果的意思
    boolean flag = false;
    //  flag 为false的时候进行数字长度增加的操作
    //  flag 为true的时候进行数字首次输入的操作
    private void action(char key2){
        /*
         * 在计算器的运算中整体的数字都是被转化为了double型的
         * Double.parseDouble ...
         * 
         */
        String text;
        switch(key2){
            case '1':case '2':case '3':case '4':case '5':
            case '6':case '7':case '8':case '9':case '0':
                if (flag) {
                    textField.setText("");
                    textField.setText(String.valueOf(key2));
                    flag = false;
                } else {
                    text = textField.getText() + key2;
                    textField.setText(text);
                    text = "";  // 因为text公用每次使用完了之后进行清空的操作
                                            
                }
                break;
                
            case '.':   
                if("".equals(textField.getText()))
                    break; // 第一个元素不能为.    
                
                if(!"".equals(textField.getText())){
                    text = textField.getText();
                    len = text.length();
                    int i = 0;
                    for(; i<len; i++) {
                        if('.' == text.charAt(i)){
                            break; // 出现两个点的情况
                        }
                    } // 确认字符窜中是否已经存在.
                    if(i<len)  //  一个字符串中不能出现多个. 
                        break;
                    text = textField.getText() + key2;
                    textField.setText(text);
                    text = "";
                }    
                break;    
            
            case '(':
                if(!"".equals(textField.getText())){
                    if ('n' == op) {
                        a = textField.getText();
                        op = '('; 
                        flag = true;
                    } else {
                        b = textField.getText();
                        calculation(a, b);
                        a = value;
                        textField.setText(value);
                        op = '(';
                        flag = true;
                    }
                    exit = '1';
                }
                break;
            case '+': 
                if(!"".equals(textField.getText())){
                    if ('n' == op) {
                        a = textField.getText();
                        op = '+'; 
                        flag = true;
                    } else {
                        b = textField.getText();
                        calculation(a, b);
                        a = value;
                        textField.setText(value);
                        op = '+';
                        flag = true;
                    }
                    exit = '1';
                }
                break;
                
            case '-':
                if(!"".equals(textField.getText())){
                    if ('n' == op) {
                        a = textField.getText();
                        op = '-'; 
                        flag = true;
                    } else {
                        b = textField.getText();
                        calculation(a, b);
                        a = value;
                        textField.setText(value);
                        op = '-';
                        flag = true;
                    }
                    exit = '1';
                }
                break;
                
            case '×':
                if(!"".equals(textField.getText())){
                    if ('n' == op) {
                        a = textField.getText();
                        op = '*'; 
                        flag = true;
                    } else {
                        b = textField.getText();
                        calculation(a, b);
                        a = value;
                        textField.setText(value);
                        op = '*';
                        flag = true;
                    }
                    exit = '1';
                }
                break;
                
            case '÷':
                if(!"".equals(textField.getText())){
                    if ('n' == op) {
                        a = textField.getText();
                        op = '/'; 
                        flag = true;
                    } else {
                        b = textField.getText();
                        calculation(a, b);
                        a = value;
                        textField.setText(value);
                        op = '/';
                        flag = true;
                    }
                    exit = '1';
                }
                break;
                
            case '<':                 
                text = textField.getText(); // 获取当前的字符串
                if(!"".equals(text)){
                    len = text.length();
                    text = text.substring(0, len-1);
                    textField.setText(text);
                }
                text="";
                break;
            
            case 'C':
                textField.setText("");    //清空字符串
                break;
            case 'D':
                if(!"".equals(textField.getText())){
                    if ('n' == op) {
                        a = textField.getText();
                        op = 'D'; 
                        flag = true;
                    } else {
                        b = textField.getText();
                        calculation(a, b);
                        a = value;
                        textField.setText(value);
                        op = 'D';
                        flag = true;
                    }
                    exit = '1';
                }
                break;
            
            case '%':
                if(!"".equals(textField.getText())){
                    if ('n' == op) {
                        a = textField.getText();
                        op = '%'; 
                        flag = true;
                    } else {
                        b = textField.getText();
                        calculation(a, b);
                        a = value;
                        textField.setText(value);
                        op = '%';
                        flag = true;
                    }
                    exit = '1';
                }
                break;
            case '√':
                if(!"".equals(textField.getText())){
                    if ('n' == op) {a = textField.getText();
                        op = '√';flag = true;
                    } else {
                        b = textField.getText();
                        calculation(a,b);
                        a = value;
                        textField.setText(value);
                        op = '√';
                        flag = true;
                    }
                    exit = '1';
                }
                break;
            case '=':
                
                if('0' == exit){
                    textField.setText("");
                    break;
                }
                if("".equals(textField.getText())) // 排除  7*=  7+= 之类错误
                    break;
                b = textField.getText();
                
                calculation(a, b);
                textField.setText(String.valueOf(value));
                break;
                
            default: ;   // 在本计算器程序中没有其它情况
        }
    }
    
    private void calculation(String a, String b){
        double v1 = Double.parseDouble(a);
        double v2 = Double.parseDouble(b);
        double v=0;
        switch(op){
            case '+':
                v = v1 + v2;    exit = '0';
                a = b = null;    op = 'n';    break;
            case '-':
                v = v1 - v2;    exit = '0';
                a = b = null;    op = 'n';    break;                
            case '*':
                v = v1 * v2;    exit = '0';
                a = b = null;    op = 'n';    break;                
            case '/':
                if(v2==0) break;
                v = v1 / v2;    exit = '0';
                a = b = null;    op = 'n';    break;
            case '%':
                if(v2==0) break;
                v = v1 % v2;    exit = '0';
                a = b = null;    op = 'n';    break;
            case '√':
                v = Math.sqrt(v1);    exit = '0';
                a = null;    op = 'n';    break;
            case 'D':
                if(v1==0) break;
                v = 1.0/v1;    exit = '0';
                a = null;    op = 'n';    break;
            case '(':
                v = -v1; exit = '0';    op = 'n';    break;
            default: ;
        }
        value = String.valueOf(v);
    }

    public static void main(String[] args) {
        new Calculator().setVisible(true);
    }
}

测试:

本次实验测试不太容易用截屏的方式来呈现下来,于是我就录了个视频,由于视频无法在CSDN平台上展现,这就靠读者个人去自己测试了(在前面已经给予了符号所表示的意思)