Java 简易计算器

编写一个简易计算器程序。要求:界面类似Windows附件自带简易计算器,能实现基本的计算功能。
Calculator.java代码如下:

import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Calculator extends JFrame implements ActionListener
{
        JFrame f=new JFrame("简易计算器");
        String[] a={"C","/","*","B",
                "7","8","9","-",
                "4","5","6","+",
                "1","2","3","=",
                "0","."};//将18个按键存入字符串组
        JButton[] b=new JButton[18];
        JTextField tf=new JTextField("0",15);//设置文本框初始化为0,长度为15
        String s=" ";
        public Calculator()
        {
                tf.setEnabled(false);//设置文本框不可编辑
                tf.setHorizontalAlignment(JTextField.RIGHT);//设置文本框右对齐
                tf.setFont(tf.getFont().deriveFont((float)(40)));//设置文本框字体及字体大小
                GridBagLayout g=new GridBagLayout();
                GridBagConstraints gb=new GridBagConstraints();//使用网格包布局管理器
                JPanel p=new JPanel(g);
                for(int i=0;i<18;i++)
                {
                        b[i]=new JButton(a[i]);//将按钮对应字符串
                        b[i].setFont(new Font("华文细黑",Font.BOLD,30));//设置按键字体及字体大小
                        b[i].addActionListener(this);//为按钮添加事件监听
                }
                gb.fill=GridBagConstraints.BOTH;//设置组件完全填满其显示区域。
                for(int j=0;j<15;j+=4)
                {
                        gb.gridwidth=1;//水平方向占1单元格
                        gb.weightx=1;//组件水平大小变化的增量值为1
                        for(int i=j;i<j+3;i++)
                        { 
                                g.setConstraints(b[i],gb);//设置b[0]、b[1]、b[2]、b[4]、b[5]、b[6]、b[8]、b[9]、b[10]、b[12]、b[13]、b[14]使用这种格式(gridwidth=1,weightx=1)
                                p.add(b[i]);//放入容器
                        }
                        if(j==12)
                                break;
                        gb.gridwidth=GridBagConstraints.REMAINDER;//占完所在行余下所有单元格(水平方向最后一个组件)
                        g.setConstraints(b[j+3],gb);//设置b[3]、b[7]、b[11]使用这种格式(gridwidth=GridBagConstraints.REMAINDER)
                        p.add(b[j+3]);//放入容器
                }
                gb.weighty=1;//组件垂直大小变化的增量值为1
                gb.gridheight=2;//垂直方向占2单元格
                g.setConstraints(b[15],gb);//设置b[15]使用这种格式(gridheight=2,weighty=1)
                p.add(b[15]);
                gb.weighty=0;//组件垂直大小不变化
                gb.gridwidth=2;//水平方向占2单元格
                gb.gridy=4;
                gb.gridx=0;//组件在网格中坐标为(0,4)
                g.setConstraints(b[16],gb);//设置b[16]使用这种格式
                p.add(b[16]);
                gb.gridx=2;//组件在网格中坐标为(2,4)
                gb.gridwidth=1;//水平方向占1单元格
                g.setConstraints(b[17],gb);//设置b[17]使用这种格式
                p.add(b[17]);
                b[15].setBackground(Color.red);//设置按钮b[15]背景为红色
                f.add(p);//将容器放入窗体
                f.add(tf,BorderLayout.NORTH);//将文本框以边界布局上部放入窗体
                f.pack();//自动设置窗体大小
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体默认关闭
                f.setVisible(true);//设置窗体可见
        }
        public void actionPerformed(ActionEvent e)//重写按钮事件监听方法
        {
                String o=e.getActionCommand();//获得点击的按钮的字符串
                boolean n=true;
                if(o.equals("+")||o.equals("-")||o.equals("*")||o.equals("/"))
                        s+=" "+o+" ";//在加减乘除前后放置空格
                else if(o.equals("C"))
                        s=" ";//初始化字符串为空格
                else if(o.equals("B"))
                {
                        char i=s.charAt(s.length()-2);//提取字符串倒数第二个字符
                        if(i=='+'||i=='-'||i=='*'||i=='/')
                                s=s.substring(0,s.length()-3);//若字符是加减乘除,则退3格
                        else
                                s=s.substring(0,s.length()-1);//若不是,退1格
                }
                else if(o.equals("="))
                {
                        s+=o+calculate(s);//调用calculate()方法计算字符串,并将结果添加至原字符串
                        tf.setText(s);//使用文本框显示字符串
                        s=" ";//初始化字符串为空格
                        n=false;
                }
                else
                        s+=o;
                if(n)
                        tf.setText(s);//输入'='前也在文本框中显示字符串
        }
        public String calculate(String t)//构造calculate()方法计算字符串
        {
                String[] a=t.split(" ");//以空格分割字符串并放入字符串组
                Stack<Double> b=new Stack<Double>();//使用栈存放算数和结果
                b.push(Double.parseDouble(a[1]));//将字符串a[1]转换为双精度型(第一个数)并放入栈中
                for(int i=2;i<a.length;i++)
                        if(i%2==0)//若i是偶数,则a[i]为加减乘除
                        {
                                if(a[i].equals("+"))
                                        b.push(Double.parseDouble(a[i+1]));//将字符串a[i+1]转换为双精度型(加减乘除后一个数)并放入栈中
                                if(a[i].equals("-"))
                                        b.push(-Double.parseDouble(a[i+1]));//负数化
                                if(a[i].equals("*"))
                                {
                                        double x=b.pop();//提取栈顶元素(乘除前一个数)
                                        double y=Double.parseDouble(a[i+1]);//将字符串a[i+1]转换为双精度型(乘除后一个数)
                                        b.push(x*y);//将相乘除的结果放入栈中
                                }
                                if(a[i].equals("/"))
                                {
                                        double x=b.pop();
                                        double y=Double.parseDouble(a[i+1]);
                                        b.push(x/y);
                                }
                        }
                double m=0;
                while(!b.isEmpty())
                        m+=b.pop();//提取栈顶元素并相加
                return String.valueOf(m);将双精度型m转化为字符串型并返回
        }
        public static void main(String[] args)
        {
                new Calculator();//在main()方法中创建类Calculator的对象
        }
}

运行截图:
Java 简易计算器_第1张图片
Java 简易计算器_第2张图片
Java 简易计算器_第3张图片
Java 简易计算器_第4张图片
Java 简易计算器_第5张图片

你可能感兴趣的:(java)