小程序---计算器

71 篇文章 0 订阅
5 篇文章 0 订阅

该计算器实现了简单的+-*/运算,而且添加了鼠标监听和键盘监听,练一练布局管理和监听,感觉挺不错的。
可能有bug,有bug请留言我尽量修复

//package 课后练习.GUI.Laout.d3;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.math.BigDecimal;

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

@SuppressWarnings("serial")
public class Calculator extends JFrame implements ActionListener{

    private JLabel lbNow,lbPre; //显示先前,当前的string
    private JButton btns[] = new JButton[19];//按钮
    private char btnName[] = {'←','\0','C','/','7','8','9','*',//每个按钮对应的字符
            '4','5','6','-','1','2','3','+','0','.','='};
    private boolean isFirst = true;//判断是否为用来计算的第一个值
    private boolean count = false;//判断是否计算过
    private boolean equal = false;//判断是否执行"="按钮
    private boolean negative = false;//判断是否为负数

    public Calculator() {
        super("计算器");
        setBounds(200, 100, 250, 350);//设置窗口大小和位置
        setDefaultCloseOperation(EXIT_ON_CLOSE);//设置关闭
        setResizable(false);//设置窗口不能改变大小
        Container contentPane = getContentPane();
        contentPane.addKeyListener(new KeyImpl());

        JPanel pShow = new JPanel(); //用来显示的面板
        pShow.setLayout(new GridLayout(2, 1));//设置网格布局
        contentPane.add(pShow,BorderLayout.NORTH);//加在JFrame北部

        //显示先前输入的内容的面板
        JPanel panelShowPre = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        lbPre = new JLabel("");//设置显示内容
        lbPre.setLayout(new FlowLayout(FlowLayout.RIGHT));//设置有右对齐
        lbPre.setFont(new Font("", Font.PLAIN, 20));//设置字体
        lbPre.addKeyListener(new KeyImpl());
        panelShowPre.add(lbPre);
        panelShowPre.setBackground(Color.white);//设置面板背景颜色
        pShow.add(panelShowPre);

        //显示当前输入的内容的面板
        JPanel panelShowNow = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        lbNow = new JLabel("0");
        lbNow.setLayout(new FlowLayout(FlowLayout.RIGHT));
        lbNow.setFont(new Font("", Font.PLAIN, 30));
        lbNow.addKeyListener(new KeyImpl());
        panelShowNow.add(lbNow);
        panelShowNow.setBackground(Color.white);
        pShow.add(panelShowNow);

        //放置普通按钮的面板
        JPanel panelBtn = new JPanel(new GridLayout(4, 4));
        setButton(panelBtn);//调用设置普通按钮的函数

        //放置特殊按钮的面板
        JPanel panelBtn2 = new JPanel(new GridLayout(1, 2));
        contentPane.add(panelBtn2,BorderLayout.SOUTH);
        btns[16] = new JButton(btnName[16]+"");
        btns[16].setFont(new Font("", Font.BOLD, 30));
        btns[16].addActionListener(this);
        btns[16].addKeyListener(new KeyImpl());
        panelBtn2.add(btns[16]);

        JPanel panelBtn2_2 = new JPanel(new GridLayout(1, 2));
        btns[17] = new JButton(btnName[17]+"");
        btns[17].setFont(new Font("", Font.BOLD, 30));
        btns[17].addActionListener(this);
        btns[17].addKeyListener(new KeyImpl());
        panelBtn2_2.add(btns[17]);

        btns[18] = new JButton(btnName[18]+"");
        btns[18].setFont(new Font("", Font.BOLD, 30));
        btns[18].addActionListener(this);
        btns[18].addKeyListener(new KeyImpl());
        panelBtn2_2.add(btns[18]);
        panelBtn2.add(panelBtn2_2);

        contentPane.add(panelBtn,BorderLayout.CENTER);

        setVisible(true);
    }
    //用来布置按钮位置的函数
    public void setButton(JPanel p){
        for (int i = 0; i < 16; i++) {
            btns[i] = new JButton();
            btns[i].setText(btnName[i]+"");
            btns[i].setFont(new Font("", Font.BOLD, 30));
            btns[i].addActionListener(this);
            btns[i].addKeyListener(new KeyImpl());
            p.add(btns[i]);
        }
        btns[0].setFont(new Font("", Font.BOLD, 25));
        btns[1].setFont(new Font("", Font.BOLD, 15));
        btns[1].setText("CE");
    }
    //实现鼠标点击各个部件的监听
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource()==btns[0]) {
            achieveDelete();
        }
        if (e.getSource()==btns[1]) {
            lbNow.setText("0");
        }
        if (e.getSource()==btns[2]) {
            lbNow.setText("0");
            lbPre.setText("");
            isFirst = true;
            count = false;
            equal = false;
        }
        if (e.getSource()==btns[3]) {
            countAndShow('/');
        }
        if (e.getSource()==btns[7]) {
            countAndShow('*');
        }
        if (e.getSource()==btns[11]) {
            countAndShow('-');
        }
        if (e.getSource()==btns[15]) {
            countAndShow('+');
        }
        //‘=’比较特殊单独实现
        if (e.getSource()==btns[18]) {
            achieveEqual();
        }
        if (e.getSource()==btns[17]) {
            lbNow.setText(lbNow.getText()+".");
        }

        if (e.getSource()==btns[4]) {
            numberShow(7);
        }
        if (e.getSource()==btns[5]) {
            numberShow(8);
        }
        if (e.getSource()==btns[6]) {
            numberShow(9);
        }
        if (e.getSource()==btns[8]) {
            numberShow(4);
        }
        if (e.getSource()==btns[9]) {
            numberShow(5);
        }
        if (e.getSource()==btns[10]) {
            numberShow(6);
        }
        if (e.getSource()==btns[12]) {
            numberShow(1);
        }
        if (e.getSource()==btns[13]) {
            numberShow(2);
        }
        if (e.getSource()==btns[14]) {
            numberShow(3);
        }
        if (e.getSource()==btns[16]) {
            numberShow(0);
        }
    }
    //用来计算的函数
    public  void count(){
        String preStr = lbPre.getText();
        char c = preStr.charAt(preStr.length()-1);
        double pre = 0;
        double now = 0;
        try {
            BigDecimal p = new BigDecimal((String) preStr.subSequence(0, preStr.length()-1));
            pre = p.doubleValue();
            BigDecimal n = new BigDecimal(lbNow.getText());
            now = n.doubleValue();
            //pre = Double.parseDouble((String) preStr.subSequence(0, preStr.length()-1));
            //now = Double.parseDouble(nowLb.getText());
        } catch (NumberFormatException e) {
        }
        switch (c) {
        case '+':
            pre += now;
            break;
        case '-':
            pre -= now;
            break;
        case '*':
            pre *= now;
            break;
        case '/':
            if (now==0) {
                lbPre.setText("除数不能为0 ");
                equal = true;
                return;
            }
            pre /= now;
            break;
        default:
        }
        lbPre.setText(pre+""+c);
    }
    //实现各个数字显示
    public void numberShow(int i){
        if (equal) {
            lbPre.setText(" ");
        }
        if (isFirst) {
            lbNow.setText("");
            isFirst = false;
            count = false;
        }
        if (negative) {
            lbNow.setText("-");
            negative = false;
        }
        if (lbNow.getText().equals("0")) {
            lbNow.setText(i+"");
            System.out.println(1);
        }else {
            lbNow.setText(lbNow.getText()+i);
            System.out.println(2);
        }
    }
    //实现计算功能并显示
    public void countAndShow(char c){
        if (isFirst && c == '-'&&lbPre.getText().equals("")) {
            lbNow.setText("-");
            negative = true;
        }
        equal =false;
        if (lbPre.getText().length()>1&&!isFirst) {
            count();
            count = true;
        }else if(!isFirst){
            lbPre.setText(lbNow.getText()+c);
        }
        if (count) {
            lbPre.setText((String) lbPre.getText().subSequence(0, lbPre.getText().length()-1)+c);
        }
        isFirst = true;
    }
    //实现‘=’功能
    public void achieveEqual(){
        if (lbPre.getText().length()>1&&!isFirst) {
            count();
            count = true;
        }else if(!isFirst){
            lbPre.setText(lbNow.getText());
        }
        if (count) {
            lbPre.setText((String) lbPre.getText().subSequence(0, lbPre.getText().length()-1)+" ");
            equal = true;
        }
        isFirst = true;
    }
    //实现删除功能
    public void achieveDelete(){
        if (!lbNow.getText().equals("0")&&lbNow.getText().length()>0) {
            lbNow.setText(" "+(String) lbNow.getText().subSequence(0, lbNow.getText().length()-1));
        }
    }

    //主函数
    public static void main(String[] args) {
        new Calculator();
    }
    //实现键盘监听各个部位
    class KeyImpl extends KeyAdapter{
        @Override
        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();
            switch (keyCode) {
            case 96:
                numberShow(0);
                break;
            case 97:
                numberShow(1);
                break;
            case 98:
                numberShow(2);
                break;
            case 99:
                numberShow(3);
                break;
            case 100:
                numberShow(4);
                break;
            case 101:
                numberShow(5);
                break;
            case 102:
                numberShow(6);
                break;
            case 103:
                numberShow(7);
                break;
            case 104:
                numberShow(8);
                break;
            case 105:
                numberShow(9);
                break;
            case 110:
                lbNow.setText(lbNow.getText()+".");
                break;
            case 107:
                countAndShow('+');
                break;
            case 109:
                countAndShow('-');
                break;
            case 106:
                countAndShow('*');
                break;
            case 111:
                countAndShow('/');
                break;
            case 10:
                achieveEqual();
                break;
            case 8:
                achieveDelete();
                break;
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值