使用Java AWT编写一个简单的计算器

1、前言
这个计算器是基于Java语言下的AWT图形库编写的。虽然功能简陋,但对于初学者而言可以为以后Java深入学习打下基础。
该计算器支持简单的四则运算。

2、演示与效果
主界面

3、各功能实现详解
(1)界面设置以及布局
按钮分为两种类型,功能类型以及输入类型按钮。输入类型按钮为0~9数字键,其它则为功能按钮。
按键采用GridLayout布局管理器将其分为4*5大小格子。添加按键时需依次从左到右,从上到下添加到Panel类型容器中,再将Panel类型容器采用GridLayout布局管理器。
文本框采用BorderLayout布局管理器置于最上方。

菜单栏中包含操作和其他两部分
操作中含有重置和退出,其他包含作者信息。
菜单栏需要用MenuBar类来实现,菜单栏中的元素需要用Menu实现,每个元素中按键采用MenuItem实现。
在创建MenuItem、Menu和MenuBar对象之后,调用Menu的add()方法将多个MenuItem组合成菜单(也可将另一个Menu对象组合起来形成二级菜单),再调用MenuBar的add()方法将多个Menu组合成菜单条,最后调用Frame对象的setMenuBar()方法来为该窗口添加菜单条。

代码实现如下:

public class Calculator
{
    private Frame f = new Frame("计算器");
    private Frame info = new Frame("关于");
    private Button[] b = new Button[10];        //b为数字类型按钮
    private Button[] cal = new Button[8];       //cal为功能类型按钮    
    private TextField text = new TextField(30); //定义一个宽度为30的文本框

    //定义菜单栏
    private MenuBar mb = new MenuBar(); 
    private Menu option = new Menu("操作");     
    private Menu other = new Menu("其他");
    private MenuItem about = new MenuItem("关于");
    private MenuItem reset = new MenuItem("重置");
    private MenuItem exit = new MenuItem("退出");

    private Label information = new Label(); //用在“关于”窗口中

    //省略无关此部分代码

    public void init()
    {
        Panel p = new Panel();   //定义Panel类型容器p,用来盛装按钮

        for(int i = 0; i <= 9; i++)
            b[i] = new Button(""+i);  //将数字键依次从0开始命名
        //功能键命名
        cal[0] = new Button("+");
        cal[1] = new Button("-");
        cal[2] = new Button("*");
        cal[3] = new Button("/");
        cal[4] = new Button("=");
        cal[5] = new Button("退格");
        cal[6] = new Button(".");
        cal[7] = new Button("AC");
        //按顺序依次将按键添加到容器p中
        p.add(b[1]);p.add(b[2]);p.add(b[3]);p.add(cal[0]);
        p.add(b[4]);p.add(b[5]);p.add(b[6]);p.add(cal[1]);
        p.add(b[7]);p.add(b[8]);p.add(b[9]);p.add(cal[2]);
        p.add(cal[5]);p.add(b[0]);p.add(cal[6]);p.add(cal[3]);
        p.add(cal[7]);p.add(cal[4]);

        text.setEditable(false);               //将文本框设置为不可直接输入
        f.add(text,BorderLayout.NORTH);        //将文本框置于最顶端并添加至窗口f
        p.setLayout(new GridLayout(5,4,4,4));  //设置GridLayout布局管理器
        f.add(p);                              //将容器p添加到窗口f
        f.setMenuBar(mb);                      //设置菜单栏
        f.setSize(280,250)                     //将窗口大小设置为280*250像素
        //“关于”窗口
        info.setSize(250,100);
        info.add(information);
        information.setText("作者:APlus  CSDN博客:abc123lzf\n");
        info.setVisible(false);
        //省略无关此部分代码
    }
    //省略无关此部分代码
}

(2)事件监听器
为了能使每个按钮能够处理用户的操作,必须要给各个组件加上事件处理机制。

在事件处理中主要涉及到三类对象
事件源:事件发生的场所,通常为各个组件,例如按钮,窗口、菜单等。
事件:事件封装了GUI组件上发生的特定事情。如果程序需要获得GUI组件上所发生的事件的相关信息,都需要通过Event对象取得。
事件监听器:负责监听事件源所发生的事件,并对各种事件做出响应处理。

现在回到计算器:
对于输入按键(0~9按键)而言,我们只需要在用户按下按键之后在文本框输入一个对应的数字即可。
代码实现:

public class Calculator
{
    //省略无关此部分代码
    class NumListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e) 
        {
            if(e.getSource() == b[0])
            {
                if(flag2 == -1)
                    text.setText(text.getText()+"0");
                else
                {
                    text.setText("0");
                    flag2 = -1;
                }
            }
            //......直到b[9];
            else if(e.getSource() == b[9])
            {
                if(flag2 == -1)
                    text.setText(text.getText()+"9");
                else
                {
                    text.setText("9");
                    flag2 = -1;
                }
            }
        }       
    }
    public void init()
    {
        NumListener numListen = new NumListener();
        //将0~9按键添加一个事件监听器
        for(int i = 0; i <= 9; i++)
            b[i].addActionListener(numListen);
        //省略无关此部分代码
    }
}

对于处理按键而言,我们需要在用户按下按键之后,对输入的数字进行计算,所以我们需要建立两个字符串型缓冲区。在第一次按下处理按键的时候,将文本框中信息复制到第一个缓冲区并将文本框清空,在第二次按下处理按键后,将文本框信息复制到第二个缓冲区并将两个缓冲区转化为double类型的值进行计算,并将计算结果显示在文本框中,再将计算结果复制到第一个缓冲区并清空第二个缓冲区,为下一次按下处理按键作准备。
代码实现:

public class Calculator
{
    //定义两个缓冲区
    private String load1 = new String();
    private String load2 = new String();

    private int flag = 0;          //用来标记是否第一次按下功能按键
    private int flag2 = -1;        //flag2标记按下第一个功能按键后,按下第一个数字按键时将文本框清空
    private int Key = -1;          //用来标记上一个功能按键,-1表示没有按下功能按键

    class CalListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e) 
        {
            if(e.getSource() == cal[0])
            {
                if(flag == 0)
                {
                    load1 = text.getText();
                    flag = 1;
                    flag2 = Key = 0;
                }
                else if(flag == 1)
                {
                    load2 = text.getText();
                    text.setText(String.valueOf(Double.parseDouble(load1) + Double.parseDouble(load2)));
                    load1 = text.getText();
                    load2 = null;
                }
            }
            else if(e.getSource() == cal[1])
            {
                if(flag == 0)
                {
                    load1 = text.getText();
                    flag = 1;
                    flag2 = Key = 1;
                }
                else if(flag == 1)
                {
                    load2 = text.getText();
                    text.setText(String.valueOf(Double.parseDouble(load1) - Double.parseDouble(load2)));
                    load1 = text.getText();
                    load2 = null;
                }
            }
            else if(e.getSource() == cal[2])
            {
                if(flag == 0)
                {
                    load1 = text.getText();
                    flag = 1;
                    flag2 = Key = 2;
                }
                else if(flag == 1)
                {
                    load2 = text.getText();
                    text.setText(String.valueOf(Double.parseDouble(load1) * Double.parseDouble(load2)));
                    load1 = text.getText();
                    load2 = null;
                }
            }
            else if(e.getSource() == cal[3])
            {
                if(flag == 0)
                {
                    load1 = text.getText();
                    flag = 1;
                    flag2 = Key = 3;
                }
                else if(flag == 1)
                {
                    load2 = text.getText();
                    text.setText(String.valueOf(Double.parseDouble(load1) /         Double.parseDouble(load2)));
                    load1 = text.getText();
                    load2 = null;
                }
            }
            else if(e.getSource() == cal[4])
            {
                if(load1 != null && load2 == null)
                {
                    load2 = text.getText();
                    if(Key == 0)
                        text.setText(String.valueOf(Double.parseDouble(load1) + Double.parseDouble(load2)));
                    else if(Key == 1)
                        text.setText(String.valueOf(Double.parseDouble(load1) - Double.parseDouble(load2)));
                    else if(Key == 2)
                        text.setText(String.valueOf(Double.parseDouble(load1) * Double.parseDouble(load2)));
                    else if(Key == 3)
                        text.setText(String.valueOf(Double.parseDouble(load1) / Double.parseDouble(load2)));
                    Key = -1;
                    flag = 0;
                    flag2 = -1;
                    load1 = text.getText();
                    load2 = null;
                }
            }
        }
    }
    public void init()
    {
        CalListener calListen = new CalListener();
        load1 = load2 = null;

        cal[0].addActionListener(calListen);
        cal[1].addActionListener(calListen);
        cal[2].addActionListener(calListen);
        cal[3].addActionListener(calListen);
        cal[4].addActionListener(calListen);
        cal[5].addActionListener(e->               //退格按键
        {
            text.setText(text.getText().substring(0,text.getText().length()-1));
        });
        cal[6].addActionListener(e->               //小数点按键
        {
            text.setText(text.getText()+".");
        });
        cal[7].addActionListener(e->               //重置按键
        {
            load1 = load2 = null;
            Key = -1;
            flag2 = -1;
            flag = 0;
            text.setText("");
        });
    }
}

对于AWT而言,需要用使用窗口监听器才能允许用户通过单击窗口右上角的“X”按钮来关闭窗口或是结束程序。我们可以创建一个类来继承WindowAdapter类并重写windowClosing()方法来实现。
代码实现:

class WindowListener extends WindowAdapter
{
    public void windowClosing(WindowEvent e)
    {
        System.exit(0);
    }
}

对于菜单栏按键而言,类似于功能按键
代码实现:

public class Calculator
{
    public void init()
    {
        exit.addActionListener(e->System.exit(0));
        reset.addActionListener(e->
        {
            load1 = load2 = null;
            Key = -1;
            flag2 = -1;
            flag = 0;
            text.setText("");
        });

        about.addActionListener(e->
        {
            info.setVisible(true);
        });
    }
}

4、所有代码

import java.awt.*;
import java.awt.event.*;

public class Calculator
{
    private Frame f = new Frame("计算器");
    private Frame info = new Frame("关于");

    private Button[] b = new Button[10];
    private Button[] cal = new Button[8];

    private MenuBar mb = new MenuBar();
    private Menu option = new Menu("操作");
    private Menu other = new Menu("其他");
    private MenuItem about = new MenuItem("关于");
    private MenuItem reset = new MenuItem("重置");
    private MenuItem exit = new MenuItem("退出");
    private Label information = new Label();

    private TextField text = new TextField(30);
    private int flag = 0;
    private int flag2 = -1;
    private int Key = -1;

    String load1 = new String();
    String load2 = new String();

    public void init()
    {
        Panel p = new Panel();
        NumListener numListen = new NumListener();
        CalListener calListen = new CalListener();

        load1 = load2 = null;

        for(int i = 0; i <= 9; i++)
            b[i] = new Button(""+i);

        info.setSize(250,100);
        information.setText("作者:APlus  CSDN博客:abc123lzf\n");

        for(int i = 0; i <= 9; i++)
            b[i].addActionListener(numListen);

        cal[0] = new Button("+");
        cal[1] = new Button("-");
        cal[2] = new Button("*");
        cal[3] = new Button("/");
        cal[4] = new Button("=");
        cal[5] = new Button("退格");
        cal[6] = new Button(".");
        cal[7] = new Button("AC");
        cal[0].addActionListener(calListen);
        cal[1].addActionListener(calListen);
        cal[2].addActionListener(calListen);
        cal[3].addActionListener(calListen);
        cal[4].addActionListener(calListen);
        cal[5].addActionListener(e->
        {
            text.setText(text.getText().substring(0,text.getText().length()-1));
        });
        cal[6].addActionListener(e->
        {
            text.setText(text.getText()+".");
        });
        p.add(b[1]);p.add(b[2]);p.add(b[3]);p.add(cal[0]);
        p.add(b[4]);p.add(b[5]);p.add(b[6]);p.add(cal[1]);
        p.add(b[7]);p.add(b[8]);p.add(b[9]);p.add(cal[2]);
        p.add(cal[5]);p.add(b[0]);p.add(cal[6]);p.add(cal[3]);
        p.add(cal[7]);p.add(cal[4]);

        text.setEditable(false);
        exit.addActionListener(e->System.exit(0));
        reset.addActionListener(e->
        {
            load1 = load2 = null;
            Key = -1;
            flag2 = -1;
            flag = 0;
            text.setText("");
        });
        cal[7].addActionListener(e->
        {
            load1 = load2 = null;
            Key = -1;
            flag2 = -1;
            flag = 0;
            text.setText("");
        });
        about.addActionListener(e->
        {
            info.setVisible(true);
        });

        option.add(reset);
        option.add(exit);
        other.add(about);
        mb.add(option);
        mb.add(other);
        f.setMenuBar(mb);


        f.add(text,BorderLayout.NORTH);
        p.setLayout(new GridLayout(5,4,4,4));

        info.add(information);
        info.addWindowListener(new WindowListener());
        f.addWindowListener(new WindowListener());
        f.add(p);
        f.setSize(280,250);
        f.setVisible(true);
    }

    class WindowListener extends WindowAdapter
    {
        public void windowClosing(WindowEvent e)
        {
            if(e.getSource() == f)
                System.exit(0);
            else if(e.getSource() == info)
                info.setVisible(false);
        }
    }

    class NumListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e) 
        {
            if(e.getSource() == b[0])
            {
                if(flag2 == -1)
                    text.setText(text.getText()+"0");
                else
                {
                    text.setText("0");
                    flag2 = -1;
                }
            }
            else if(e.getSource() == b[1])
            {
                if(flag2 == -1)
                    text.setText(text.getText()+"1");
                else
                {
                    text.setText("1");
                    flag2 = -1;
                }
            }
            else if(e.getSource() == b[2])
            {
                if(flag2 == -1)
                    text.setText(text.getText()+"2");
                else
                {
                    text.setText("2");
                    flag2 = -1;
                }
            }
            else if(e.getSource() == b[3])
            {
                if(flag2 == -1)
                    text.setText(text.getText()+"3");
                else
                {
                    text.setText("3");
                    flag2 = -1;
                }
            }
            else if(e.getSource() == b[4])
            {
                if(flag2 == -1)
                    text.setText(text.getText()+"4");
                else
                {
                    text.setText("4");
                    flag2 = -1;
                }
            }
            else if(e.getSource() == b[5])
            {
                if(flag2 == -1)
                    text.setText(text.getText()+"5");
                else
                {
                    text.setText("5");
                    flag2 = -1;
                }
            }
            else if(e.getSource() == b[6])
            {
                if(flag2 == -1)
                    text.setText(text.getText()+"6");
                else
                {
                    text.setText("6");
                    flag2 = -1;
                }
            }
            else if(e.getSource() == b[7])
            {
                if(flag2 == -1)
                    text.setText(text.getText()+"7");
                else
                {
                    text.setText("7");
                    flag2 = -1;
                }
            }
            else if(e.getSource() == b[8])
            {
                if(flag2 == -1)
                    text.setText(text.getText()+"8");
                else
                {
                    text.setText("8");
                    flag2 = -1;
                }
            }
            else if(e.getSource() == b[9])
            {
                if(flag2 == -1)
                    text.setText(text.getText()+"9");
                else
                {
                    text.setText("9");
                    flag2 = -1;
                }
            }
        }       
    }

    class CalListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e) 
        {
            if(e.getSource() == cal[0])
            {
                if(flag == 0)
                {
                    load1 = text.getText();
                    flag = 1;
                    flag2 = Key = 0;
                }
                else if(flag == 1)
                {
                    load2 = text.getText();
                    text.setText(String.valueOf(Double.parseDouble(load1) + Double.parseDouble(load2)));
                    load1 = text.getText();
                    load2 = null;
                    //flag = 0;
                }
            }
            else if(e.getSource() == cal[1])
            {
                if(flag == 0)
                {
                    load1 = text.getText();
                    flag = 1;
                    flag2 = Key = 1;
                }
                else if(flag == 1)
                {
                    load2 = text.getText();
                    text.setText(String.valueOf(Double.parseDouble(load1) - Double.parseDouble(load2)));
                    load1 = text.getText();
                    load2 = null;
                    //flag = 0;
                }
            }
            else if(e.getSource() == cal[2])
            {
                if(flag == 0)
                {
                    load1 = text.getText();
                    flag = 1;
                    flag2 = Key = 2;
                }
                else if(flag == 1)
                {
                    load2 = text.getText();
                    text.setText(String.valueOf(Double.parseDouble(load1) * Double.parseDouble(load2)));
                    load1 = text.getText();
                    load2 = null;
                    //flag = 0;
                }
            }
            else if(e.getSource() == cal[3])
            {
                if(flag == 0)
                {
                    load1 = text.getText();
                    flag = 1;
                    flag2 = Key = 3;
                }
                else if(flag == 1)
                {
                    load2 = text.getText();
                    text.setText(String.valueOf(Double.parseDouble(load1) / Double.parseDouble(load2)));
                    load1 = text.getText();
                    load2 = null;
                    //flag = 0;
                }
            }
            else if(e.getSource() == cal[4])
            {
                if(load1 != null && load2 == null)
                {
                    load2 = text.getText();
                    if(Key == 0)
                        text.setText(String.valueOf(Double.parseDouble(load1) + Double.parseDouble(load2)));
                    else if(Key == 1)
                        text.setText(String.valueOf(Double.parseDouble(load1) - Double.parseDouble(load2)));
                    else if(Key == 2)
                        text.setText(String.valueOf(Double.parseDouble(load1) * Double.parseDouble(load2)));
                    else if(Key == 3)
                        text.setText(String.valueOf(Double.parseDouble(load1) / Double.parseDouble(load2)));
                    Key = -1;
                    flag = 0;
                    flag2 = -1;
                    load1 = text.getText();
                    load2 = null;
                }
            }
        }
    }

    public static void main(String[] args)
    {
        new Calculator().init();
    }
}
  • 17
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java AWT 组件可以用来实现一个简单计算器,支持混合计算。以下是实现的步骤: 1. 创建一个 JFrame 窗口,设置布局为 BorderLayout。 2. 在窗口的顶部添加一个 JTextField 组件,用于显示计算结果。 3. 在窗口的中间添加一个 JPanel 组件,设置布局为 GridLayout,用于放置数字和运算符按钮。 4. 创建数字和运算符按钮,添加到 JPanel 中。 5. 为数字和运算符按钮添加 ActionListener,实现计算器功能。 6. 在 ActionListener 中,根据用户输入的数字和运算符,使用栈来实现混合计算。 7. 将计算结果显示在 JTextField 中。 下面是示例代码: ```java import java.awt.*; import java.awt.event.*; import java.util.Stack; import javax.swing.*; public class Calculator extends JFrame implements ActionListener { private JTextField resultField; private JPanel buttonPanel; private Stack<Double> numStack; private Stack<Character> opStack; public Calculator() { super("Calculator"); // 设置布局为 BorderLayout setLayout(new BorderLayout()); // 添加结果显示组件 resultField = new JTextField(); resultField.setEditable(false); add(resultField, BorderLayout.NORTH); // 添加按钮面板 buttonPanel = new JPanel(); buttonPanel.setLayout(new GridLayout(4, 4)); add(buttonPanel, BorderLayout.CENTER); // 创建数字和运算符按钮 JButton[] buttons = { new JButton("7"), new JButton("8"), new JButton("9"), new JButton("/"), new JButton("4"), new JButton("5"), new JButton("6"), new JButton("*"), new JButton("1"), new JButton("2"), new JButton("3"), new JButton("-"), new JButton("0"), new JButton("."), new JButton("="), new JButton("+") }; // 添加按钮到面板中 for (JButton button : buttons) { buttonPanel.add(button); button.addActionListener(this); } // 初始化栈 numStack = new Stack<>(); opStack = new Stack<>(); // 设置窗口大小和可见性 setSize(300, 300); setVisible(true); } @Override public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); if (command.matches("[0-9.]")) { // 处理数字输入 double num = Double.parseDouble(command); numStack.push(num); } else if (command.matches("[+\\-*/]")) { // 处理运算符输入 char op = command.charAt(0); while (!opStack.empty() && priority(op) <= priority(opStack.peek())) { double num2 = numStack.pop(); double num1 = numStack.pop(); char op1 = opStack.pop(); numStack.push(eval(num1, num2, op1)); } opStack.push(op); } else { // 处理等号输入 while (!opStack.empty()) { double num2 = numStack.pop(); double num1 = numStack.pop(); char op = opStack.pop(); numStack.push(eval(num1, num2, op)); } } // 更新结果显示 if (!numStack.empty()) { resultField.setText(numStack.peek().toString()); } } private int priority(char op) { switch (op) { case '+': case '-': return 1; case '*': case '/': return 2; default: return 0; } } private double eval(double num1, double num2, char op) { switch (op) { case '+': return num1 + num2; case '-': return num1 - num2; case '*': return num1 * num2; case '/': return num1 / num2; default: return 0; } } public static void main(String[] args) { new Calculator(); } } ``` 这个计算器可以支持混合计算,例如输入 "2+3*4/2",结果会显示为 "8.0"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值