Java——实现windows计算器图形化与功能(代码详解)

        迫于Java老师布置的这个计算器项目还要答辩,无奈之下自己写了一个windows版的计算器,可以键盘输入也可以鼠标点击,有需要的朋友可以借鉴一下哈。

        下面左边的是windows电脑自带的计算器,右边的是代码实现下的计算器。

        功能都可以实现哟

下方是代码,各位看官老爷敬请观看,有注释哈,不懂的请在评论留言。

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;


public class Calculator extends JFrame{
    public static void main(String[] args) {
        Calculator page=new Calculator();
    }
    String d="";//计算机上显示的式子
    String result="";//计算机上按”=“键之后显示的结果
    int flag=0,style=0;//style的值判断是加减乘除哪种运算,flag的值判断是否为小数运算

    //连续进行算法的判断条件boo,bo
    boolean boo=false;
    boolean bo=false;
    Calculator() {
        //界面设置
        JFrame jFrame=new JFrame();
        jFrame.setSize(340,540);
        //布局
        jFrame.setLayout(null);
        //关闭方式
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //打开时的默认位置
        jFrame.setLocationRelativeTo(null);
        jFrame.setTitle("计算器");

        //设置按钮中的字体样式
        Font font_one = new Font("Courier New",Font.BOLD,24);
        Font font_two = new Font("Courier New", Font.PLAIN,16);
        Font font_three = new Font("Courier New", Font.PLAIN,24);
        Font font_four = new Font("Courier New", Font.PLAIN,16);

        //设置计算器界面中的各种按钮
        JButton j_one=new JButton("+/-");
        j_one.setBounds(5,450,75,50);
        //调用按钮字体样式
        j_one.setFont(font_two);
        //按钮背景颜色
        j_one.setBackground(Color.white);
        //加入界面
        jFrame.add(j_one);
        //下方都是按钮
        //在这里也可以提却方法,然后用for循环来设置按钮,但我是午休之后写的,脑子比较昏,当时没想到,写完看到这么多代码,头都大了
        JButton j_two=new JButton("0");
        j_two.setBounds(85,450,75,50);
        j_two.setFont(font_one);
        j_two.setBackground(Color.white);
        jFrame.add(j_two);

        JButton j_three=new JButton(".");
        j_three.setBounds(165,450,75,50);
        j_three.setFont(font_two);
        j_three.setBackground(Color.white);
        jFrame.add(j_three);

        JButton j_four=new JButton("=");
        j_four.setBounds(245,450,75,50);
        j_four.setBackground(Color.DARK_GRAY);
        j_four.setFont(font_one);
        //按钮字体颜色
        j_four.setForeground(Color.WHITE);
        jFrame.add(j_four);

        JButton j_five=new JButton("1");
        j_five.setBounds(5,398,75,50);
        j_five.setFont(font_one);
        j_five.setBackground(Color.white);
        jFrame.add(j_five);

        JButton j_six=new JButton("2");
        j_six.setBounds(85,398,75,50);
        j_six.setFont(font_one);
        j_six.setBackground(Color.white);
        jFrame.add(j_six);

        JButton j_seven=new JButton("3");
        j_seven.setBounds(165,398,75,50);
        j_seven.setFont(font_one);
        j_seven.setBackground(Color.white);
        jFrame.add(j_seven);

        JButton j_eight=new JButton("+");
        j_eight.setBounds(245,398,75,50);
        j_eight.setFont(font_three);
        j_eight.setBackground(Color.white);
        jFrame.add(j_eight);

        JButton j_nine=new JButton("4");
        j_nine.setBounds(5,346,75,50);
        j_nine.setFont(font_one);
        j_nine.setBackground(Color.white);
        jFrame.add(j_nine);

        JButton j_ten=new JButton("5");
        j_ten.setBounds(85,346,75,50);
        j_ten.setFont(font_one);
        j_ten.setBackground(Color.white);
        jFrame.add(j_ten);

        JButton j_eleven=new JButton("6");
        j_eleven.setBounds(165,346,75,50);
        j_eleven.setFont(font_one);
        j_eleven.setBackground(Color.white);
        jFrame.add(j_eleven);

        JButton j_twelve=new JButton("-");
        j_twelve.setBounds(245,346,75,50);
        j_twelve.setFont(font_three);
        j_twelve.setBackground(Color.white);
        jFrame.add(j_twelve);

        JButton j_thirteen=new JButton("7");
        j_thirteen.setBounds(5,294,75,50);
        j_thirteen.setFont(font_one);
        j_thirteen.setBackground(Color.white);
        jFrame.add(j_thirteen);

        JButton j_fourteen=new JButton("8");
        j_fourteen.setBounds(85,294,75,50);
        j_fourteen.setFont(font_one);
        j_fourteen.setBackground(Color.white);
        jFrame.add(j_fourteen);

        JButton j_fifteen=new JButton("9");
        j_fifteen.setBounds(165,294,75,50);
        j_fifteen.setFont(font_one);
        j_fifteen.setBackground(Color.white);
        jFrame.add(j_fifteen);

        JButton j_sixteen=new JButton("×");
        j_sixteen.setBounds(245,294,75,50);
        j_sixteen.setFont(font_three);
        j_sixteen.setBackground(Color.white);
        jFrame.add(j_sixteen);

        JButton j_seventeen=new JButton("1/x");
        j_seventeen.setBounds(5,242,75,50);
        j_seventeen.setFont(font_two);
        j_seventeen.setBackground(Color.white);
        jFrame.add(j_seventeen);

        JButton j_eighteen=new JButton("x²");
        j_eighteen.setBounds(85,242,75,50);
        j_eighteen.setFont(font_two);
        j_eighteen.setBackground(Color.white);
        jFrame.add(j_eighteen);

        JButton j_nineteen=new JButton("√x");
        j_nineteen.setBounds(165,242,75,50);
        j_nineteen.setFont(font_two);
        j_nineteen.setBackground(Color.white);
        jFrame.add(j_nineteen);

        JButton j_twenty=new JButton("÷");
        j_twenty.setBounds(245,242,75,50);
        j_twenty.setFont(font_three);
        j_twenty.setBackground(Color.white);
        jFrame.add(j_twenty);

        JButton j1=new JButton("%");
        j1.setBounds(5,190,75,50);
        j1.setFont(font_three);
        j1.setBackground(Color.white);
        jFrame.add(j1);

        JButton j2=new JButton("CE");
        j2.setBounds(85,190,75,50);
        j2.setFont(font_two);
        j2.setBackground(Color.white);
        jFrame.add(j2);

        JButton j3=new JButton("C");
        j3.setBounds(165,190,75,50);
        j3.setFont(font_two);
        j3.setBackground(Color.white);
        jFrame.add(j3);

        JButton j4=new JButton("⌫");

        j4.setBounds(245,190,75,50);
        j4.setFont(font_three);
        j4.setBackground(Color.white);
        jFrame.add(j4);

        JButton M1=new JButton("MC");
        M1.setBackground(Color.white);
        M1.setBorder(null);
        M1.setFont(font_four);
        M1.setBounds(10,160,40,20);
        jFrame.add(M1);

        JButton M2=new JButton("MR");
        M2.setBackground(Color.white);
        M2.setBorder(null);
        M2.setFont(font_four);
        M2.setBounds(60,160,40,20);
        jFrame.add(M2);

        JButton M3=new JButton("M+");
        M3.setBackground(Color.white);
        M3.setBorder(null);
        M3.setFont(font_four);
        M3.setBounds(110,160,40,20);
        jFrame.add(M3);

        JButton M4=new JButton("M-");
        M4.setBackground(Color.white);
        M4.setBorder(null);
        M4.setFont(font_four);
        M4.setBounds(160,160,40,20);
        jFrame.add(M4);

        JButton M5=new JButton("MS");
        M5.setBackground(Color.white);
        M5.setBorder(null);
        M5.setFont(font_four);
        M5.setBounds(210,160,40,20);
        jFrame.add(M5);

        JButton M6=new JButton("Mv");
        M6.setBackground(Color.white);
        M6.setBorder(null);
        M6.setFont(font_four);
        M6.setBounds(260,160,40,20);
        jFrame.add(M6);

        //文本框区域,计算器上显示区域
        JTextField jTextField=new JFormattedTextField(0);
        jTextField.setBounds(5,30,318,100);
        //文本从右边开始
        jTextField.setHorizontalAlignment(JTextField.RIGHT);
        //设置显示字体
        jTextField.setFont(font_one);
        jFrame.add(jTextField);

        jFrame.setVisible(true);

        //数字0~9按钮设置鼠标监听设置
        extracted(j_two, jTextField);
        extracted(j_five, jTextField);
        extracted(j_six, jTextField);
        extracted(j_seven, jTextField);
        extracted(j_nine, jTextField);
        extracted(j_ten, jTextField);
        extracted(j_eleven, jTextField);
        extracted(j_thirteen, jTextField);
        extracted(j_fourteen, jTextField);
        extracted(j_fifteen, jTextField);
        //按钮‘.’的鼠标监听
        j_three.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                if (e.getButton() == 1) {
                    flag=1;//表示为小数运算
                    d=d+j_three.getText();//更新d的值
                    jTextField.setText(d);//在计算器上显示出来
                }
            }
        });

        j4.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                if(e.getButton()==1){
                    String f="";
                    //删除键的原理,就是去掉最后一位。
                    for (int i = 0; i < d.length()-1; i++) {
                        f+=d.charAt(i);
                    }
                    d=f;
                    jTextField.setText(d);
                }
            }
        });
        //这是一键清除按钮的设置
        extracted1(j2, jTextField);
        extracted1(j3, jTextField);

        //这是计算器加减乘除功能按钮设置
        extracted1(j_eight, jTextField,1);
        extracted1(j_twelve, jTextField,2);
        extracted1(j_sixteen, jTextField,3);
        extracted1(j_twenty, jTextField,4);
        //特殊功能按钮1:‘1/x’按钮的设置
        j_seventeen.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                if(e.getButton()==1){
                    result=(1.0/Double.parseDouble(d))+"";
                    flag=1;
                    jTextField.setText(result);
                    d=result;
                }
            }
        });
        //特殊功能按钮2:‘x^2’按钮的设置
        j_eighteen.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                if(e.getButton()==1){
                    if(flag==0){
                        result=Integer.parseInt(d)*Integer.parseInt(d)+"";
                    }else{
                        result=Double.parseDouble(d)*Double.parseDouble(d)+"";
                    }
                    jTextField.setText(result);
                    d=result;
                }
            }
        });
        //特殊功能按钮3:‘根号下x’按钮的设置
        j_nineteen.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                if(e.getButton()==1){
                    if(flag==0){
                        result=Math.sqrt(Integer.parseInt(d))+"";
                    }else{
                        result=Math.sqrt(Double.parseDouble(d))+"";
                    }
                    jTextField.setText(result);
                    d=result;
                    flag=1;
                }
            }
        });
        //特殊功能按钮4:‘%’按钮的设置,功能为让小数点前移2位
        j1.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                if(e.getButton()==1){
                    double a=Double.parseDouble(d);
                    //警告,不能用int,如果是int类型的/100之后的得到的只是整数
                    //eg:1/100=0,1000/100=10
                    a=a/100;
                    d=a+"";
                    jTextField.setText(d);
                    flag=1;
                }
            }
        });
        //特殊功能按钮5:‘+/-’按钮的设置,功能给数字转换正负
        j_one.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                if(e.getButton()==1){
                    if(d.charAt(0)!='-'&&d.charAt(0)!='+'){
                        d="-"+d;
                    }else if(d.charAt(0)!='+'){
                        String s="";
                        for (int i = 1; i < d.length(); i++) {
                            s+=d.charAt(i);
                        }
                        d=s;
                    }else{
                        String s="";
                        for (int i = 1; i < d.length(); i++) {
                            s+=d.charAt(i);
                        }
                        d=s;
                    }
                    jTextField.setText(d);
                }
            }
        });
        特殊功能按钮6:‘=’按钮的设置,功能:得到结果
        j_four.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                if(e.getButton()==1){
                    //整数计算
                    extracted("\\×", "\\÷");
                        d=result;
                        style=0;
                        boo=false;
                        jTextField.setText(result);
                }
            }
        });
        //特殊功能按钮7,功能:点击Mv按钮后满足连续运算得条件1,boo
        M6.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                if(e.getButton()==1){
                    boo=true;
                }
            }
        });
        //键盘监听
        jTextField.addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                super.keyTyped(e);
                //监听0~9的数字和'.'和加减乘除
                if (Character.isDigit(e.getKeyChar())) {
                    int digit = Character.getNumericValue(e.getKeyChar());
                    d = d+digit;
                }
                if(e.getKeyChar()=='.'){
                    flag=1;
                    d=d+e.getKeyCode();
                }
                if(e.getKeyChar()=='+'){
                    style=1;
                    d=d+e.getKeyChar();
                    boo=true;
                }
                if(e.getKeyChar()=='-'){
                    style=2;
                    d=d+e.getKeyChar();
                    boo=true;


                }
                if(e.getKeyChar()=='*'){
                    style=3;
                    d=d+e.getKeyChar();
                    boo=true;

                }
                if(e.getKeyChar()=='/'){
                    style=4;
                    d=d+e.getKeyChar();
                    boo=true;
                }
            }
            //键盘监听回车键和删除键
            @Override
            public void keyPressed(KeyEvent e) {
                super.keyPressed(e);
                //回车
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    Calculator.this.extracted("\\*", "\\/");
                    d=result;
                    style=0;
                    jTextField.setText(d);
                    boo=false;
                }
                //删除
                if(e.getKeyCode()==KeyEvent.VK_BACK_SPACE){
                    String f="";
                    for (int i = 0; i < d.length()-1; i++) {
                        f+=d.charAt(i);
                    }
                    d=f;
                }
            }
        });

    }

    private void extracted(String regex, String regex1) {
        if (flag == 0) {
            if (style == 1) {
                String[] str = d.split("\\+");
                result = Integer.parseInt(str[0]) + Integer.parseInt(str[1]) + "";
            } else if (style == 2) {
                if(d.charAt(0)=='-'){
                    String s="";
                    for (int i = 1; i < d.length(); i++) {
                        s+=d.charAt(i);
                    }
                    d=s;
                    String[] str = d.split("\\-");
                    result = -Integer.parseInt(str[0]) - Integer.parseInt(str[1]) + "";
                }else {
                    String[] str = d.split("\\-");
                    result = Integer.parseInt(str[0]) - Integer.parseInt(str[1]) + "";
                }
            } else if (style == 3) {
                String[] str = d.split(regex);
                result = Integer.parseInt(str[0]) * Integer.parseInt(str[1]) + "";
            } else if (style == 4) {
                String[] str = d.split(regex1);
                result = Integer.parseInt(str[0]) / Integer.parseInt(str[1]) + "";
            }
        } else {
            if (style == 1) {
                String[] str = d.split("\\+");
                result = Double.parseDouble(str[0]) + Double.parseDouble(str[1]) + "";
            } else if (style == 2) {
                String[] str = d.split("\\-");
                result = Double.parseDouble(str[0]) - Double.parseDouble(str[1]) + "";
            } else if (style == 3) {
                String[] str = d.split(regex);
                result = Double.parseDouble(str[0]) * Double.parseDouble(str[1]) + "";
            } else if (style == 4) {
                String[] str = d.split(regex1);
                result = Double.parseDouble(str[0]) / Double.parseDouble(str[1]) + "";
            }
        }
    }

    private void extracted1(JButton j2, JTextField jTextField) {
        j2.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                if(e.getButton()==1){
                    d="";
                    jTextField.setText(d);
                    boo=false;
                    bo=false;
                    flag=0;
                    style=0;
                }
            }
        });
    }

    private void extracted1(JButton j, JTextField jTextField,int t) {
        j.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                if (e.getButton() == 1) {
                    if(!bo||!boo){//经过=号的加减乘除运算
                        d=d+j.getText();
                        jTextField.setText(d);
                        bo=true;//满足连续运算的条件2.bo
                       // boo=true;
                    }else if(bo&&boo){//不经过=号直接进行连续加减乘除运算
                        extracted("\\×", "\\÷");
                        d=result+j.getText();
                        jTextField.setText(d);
                    }
                    style=t;
                }
            }
        });
    }


    private void extracted(JButton j, JTextField jTextField) {
        j.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                if (e.getButton() == 1) {
                    d=d+j.getText();
                    jTextField.setText(d);
                }
            }
        });
    }
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值