java基础语言写简单计算器

来源:互联网 发布:广东人 知乎 编辑:程序博客网 时间:2024/04/29 10:18

正在如火如荼地初学java基础,老师布置的小作业,供大家学习,功能甚少。只是有加减乘除等号。

import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.LinkedList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class S3 extends JFrame implements ActionListener {
    // 面板容器
    private Container container;
    // 计算器结果栏
    private JLabel resultLabel;
    // 数字键0-9
    private JButton[] numbers;
    // +,-,*,/ 四个操作符
    private JButton add, sub, mul, div;
    private JButton equal;
    // 保存数据链
    private LinkedList<String> datalist;

    boolean isPressEqualButton = false;

    public S3() {
        // 绘制计算器的窗体大小
        this.setTitle("计算器");
        this.setSize(400, 250);
        // 生成LinkedList的一个实例
        datalist = new LinkedList<String>();
        // 绘制panel容器的初始值
        JPanel panel1 = new JPanel();
        JPanel panel2 = new JPanel();
        // 网格形式对容器的组件进行布置,创建具有指定行数和列数的网格布局。
        panel1.setLayout(new GridLayout(1, 5));
        panel2.setLayout(new GridLayout(4, 5));
        // 第一个容器用来加载结果显示栏内容
        resultLabel = new JLabel("0");
        // resultLabel.setText("0");
        // 设置水平居右对其
        resultLabel.setHorizontalAlignment(JLabel.RIGHT);
        resultLabel.setEnabled(false);// 不可编辑
        panel1.add(resultLabel);
        // 初始化设置数字按钮
        numbers = new JButton[10];
        for (int i = 0; i < 10; i++)
            numbers[i] = new JButton("" + i);// 类型自动转换
        add = new JButton("+");
        sub = new JButton("-");
        mul = new JButton("×");
        div = new JButton("/");

        equal = new JButton("=");

        // 给数字键增加事件监听
        for (int i = 0; i < 10; i++) {
            numbers[i].addActionListener(this);
            add.addActionListener(this);
            sub.addActionListener(this);
            mul.addActionListener(this);
            div.addActionListener(this);
            equal.addActionListener(this);
        }
        // 加入面板2
        panel2.add(numbers[7]);// 增加第一行
        panel2.add(numbers[8]);
        panel2.add(numbers[9]);
        panel2.add(add);
        // 增加第二行
        panel2.add(numbers[4]);
        panel2.add(numbers[5]);
        panel2.add(numbers[6]);
        panel2.add(sub);
        // 增加第三行
        panel2.add(numbers[1]);
        panel2.add(numbers[2]);
        panel2.add(numbers[3]);
        panel2.add(mul);
        // 增加地四行
        panel2.add(numbers[0]);
        panel2.add(equal);
        panel2.add(div);

        // 加入所有面板到容器中
        container = this.getContentPane();
        container.add(panel1, "North");
        container.add(panel2, "Center");
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });// 添加指定的窗口侦听器,以从此窗口接收窗口事件
    }

    public void actionPerformed(ActionEvent ae) {// 鼠标事件监听
        JButton btn = (JButton) ae.getSource();
        if (btn == numbers[0] || btn == numbers[1] || btn == numbers[2] || btn == numbers[3] || btn == numbers[4]
                || btn == numbers[5] || btn == numbers[6] || btn == numbers[7] || btn == numbers[8]
                || btn == numbers[9]) {
            execNumber(btn);
        } else if (btn == add || btn == sub || btn == mul || btn == div) {
            execOperation(btn);
        } else if (btn == equal) {
            execResult();
        }
    }

    // 执行运行结果
    private void execResult() {
        isPressEqualButton = true;
        // 当列表长度为1或者2时,说明不能计算,保持数据不变
        if (datalist.size() > 0 && datalist.size() < 3) {
            String str = datalist.getFirst();
            resultLabel.setText("" + Double.parseDouble(str));// 去除小数点后面多余追加的零
            datalist.clear();// 清空列表数据
            datalist.add(str);// 加入这个结果
        } else if (datalist.size() == 3) {
            double result = 0.0d;
            int temp = 0;// 去掉结果为整数时所带的小数点
            String num1 = datalist.getFirst();
            String op = datalist.get(1);
            String num2 = datalist.getLast();
            if (op.equals("+")) {// +++++++++++++++
                result = Double.parseDouble(num1) + Double.parseDouble(num2);
            } else if (op.equals("-")) {// ---------------
                result = Double.parseDouble(num1) - Double.parseDouble(num2);
            } else if (op.equals("*")) {// **************
                result = Double.parseDouble(num1) * Double.parseDouble(num2);
            } else if (op.equals("/")) {//////////////////
                result = Double.parseDouble(num1) / Double.parseDouble(num2);
            }
            datalist.clear();// 清空
            datalist.add("" + result);// 使得结果加入列表中
            temp = (int) result;
            if (Double.isInfinite(result) == true)// 判断结果是否除数为零
            {
                datalist.clear();// 再次清空列表数据
                resultLabel.setText("除数不能为零");// 回显错误结果
            } else if (Double.isNaN(result) == true) {
                datalist.clear();// 再次清空列表数据
                resultLabel.setText("结果为定义");// 回显错误结果
            } else if ((result - temp) == 0)
                resultLabel.setText("" + temp);// 回显结果
            else
                resultLabel.setText("" + result);// 回显结果
        }
    }

    // 执行操作功能
    private void execOperation(JButton btn) {
        String sign = null;
        if (btn == add) {
            sign = "+";
        } else if (btn == sub) {
            sign = "-";
        } else if (btn == mul) {
            sign = "*";
        } else if (btn == div) {
            sign = "/";
        }
        // 根据列表中元素的个数判断增加,列表元素为1时
        if (datalist.size() == 1) {
            datalist.add(sign);// 追加操作符
        }
        // 列表中元素为2,说明要替换现有的操作符
        else if (datalist.size() == 2) {
            datalist.set(1, sign);
        }
        // 列表中元素为3时,则取出前两个进行计算
        else if (datalist.size() == 3) {
            execResult();// 调用此方法执行,等号键为false
            isPressEqualButton = false;
            datalist.add(sign);
        }
    }

    private void execNumber(JButton btn) {
        int num = 0;
        if (btn == numbers[0])
            num = 0;
        else if (btn == numbers[1])
            num = 1;
        else if (btn == numbers[2])
            num = 2;
        else if (btn == numbers[3])
            num = 3;
        else if (btn == numbers[4])
            num = 4;
        else if (btn == numbers[5])
            num = 5;
        else if (btn == numbers[6])
            num = 6;
        else if (btn == numbers[7])
            num = 7;
        else if (btn == numbers[8])
            num = 8;
        else if (btn == numbers[9])
            num = 9;
        // 列表为空的情况,加数到链表中,并设置等号键为false
        if (datalist.size() == 0) {
            datalist.add("" + num);
            resultLabel.setText("" + num);
            isPressEqualButton = false;
        }
        // 如果列表长度为1,取数合并结果
        else if ((datalist.size() == 1) && (isPressEqualButton == false))// 说明还是第一个数据中的
        {
            String str = datalist.getFirst();
            if (str.equals("0"))// 清除以0开头的数字
                str = "";
            String str0 = str.concat(String.valueOf(num));
            // 覆盖列表中第一元素的内容
            datalist.set(0, str0);
            resultLabel.setText(str0);
        } else if ((datalist.size() == 1) && (isPressEqualButton == true))// 表示已经是另外一个数据,上一个作废
        {
            datalist.set(0, String.valueOf(num));// 覆盖
            resultLabel.setText("" + num);// 显示
            isPressEqualButton = false;// 还原
        }
        // 列表为2,则加入第二个操作数
        else if (datalist.size() == 2) {
            datalist.add("" + num);
            resultLabel.setText("" + num);
        }
        // 列表为3,表示继续输入的数据为第二操作数
        else if (datalist.size() == 3) {
            String str = datalist.getLast();
            if (str.equals("0"))
                str = "";
            String strLast = str.concat("" + num);
            // 设置第二操作数的更新
            datalist.set(2, strLast);
            resultLabel.setText(strLast);
        }
    }

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

1 0
原创粉丝点击