【Java】可连续计算的整数计算器

先说思路:在主页面里添加两个控件:顶部的文本框和下方承载按钮的面板控件,然后在下方的面板控件中依次填入按钮。
但是这里还有一个问题就是如何填入大量的按钮。16个按钮一个一个实例化再填入将会造成较大的工作量,但是像课本中那样写个名字数组再一股脑地实例化又会破坏语义性,在后期我们绑定事件时造成非常大的麻烦。为了在其中找到一个折中点,我们选用数字按钮使用数组实例化,而功能按钮(加减乘除等)单独实例化。

注意看图,数字是倒序显示的,所以不要忘了在保存插入顺序的数组中倒序插入数字按钮。

内部逻辑:创立四个变量,用于存储第一个操作数(被加数/被减数/被乘数/被除数)、第二个操作数(加数/减数/乘数/除数)、运算符号(char)、判断目前操作数的Boolean判断值。
判断值初始化为False,表示操作第一个操作数,按下的数字将存储于此,按下运算符后,存储运算符号并改变判断值,移动到第二个操作数,等待用户输入。按下等于号后,判断运算符号并进行相应运算。

上代码:

package Test;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MainWindow extends JFrame {

    int firstnum;//第一个操作数
    int secondnum;//第二个操作数
    char func;//存储计算符号
    boolean isFirstnum=true;//存储是否已为第一个操作数赋值
    TextField textField;//存储显示框,否则子类无法得到值

    MainWindow(String title)
    {
        super(title);//调用JFrame的构造函数为窗口标题赋值
        initializeWindow();//初始化窗口
        initializeControls();//初始化控件
        this.setVisible(true);//设置窗口可见性 每次设置可见性时系统刷新窗口
        // 如果在这之前设置可见性会导致后面添加的控件知道界面再次刷新时才可见
    }

    //初始化窗口方法
    private void  initializeWindow()
    {
        this.setSize(400,200);//设置窗口大小
        this.setLocation(400,400);//设置窗口首次出现的位置
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置用户点击退出时的策略
    }

    //初始化窗口内部的控件
    private void initializeControls() {
        JButton[] buttons=new JButton[10];//建立一个数组,用来存放数字按钮
        JButton[] order = new JButton[16];//建立一个数组,用来存放按钮在表格中的插入顺序
        JPanel mainjp = new JPanel(new BorderLayout());//实例化主窗口(承载边界停靠面板)的面板
        JPanel buttonjp = new JPanel(new GridLayout(4, 4));//实例化存放按钮(承载表格面板)的面板
        textField = new TextField();//实例化文本框
        textField.setText("");
        mainjp.add(textField, BorderLayout.NORTH);//将文本框固定在主窗口面板的上方
        for (int i = 0; i < buttons.length; i++) {
            buttons[i] = new JButton(Integer.toString(i));//实例化数字按钮,并为其显示内容赋值
            buttons[i].addActionListener(new NumEventListener());
        }
        for (int i = 0; i < buttons.length; i++) order[i] = buttons[buttons.length - i - 1];//将数字按钮以倒序插入表格的插入顺序中(显示顺序为9→0)
        JButton addition = new JButton("+");//实例化控制按钮“加”,并为其显示内容赋值
        addition.addActionListener(new FuncEventListener());
        order = insert(order, addition, 3);//将其插入到表格插入顺序数组索引为3的位置(第一行最右边),以下同
        JButton subtraction = new JButton("-");
        subtraction.addActionListener(new FuncEventListener());
        order = insert(order, subtraction, 7);
        JButton multiplication = new JButton("*");
        multiplication.addActionListener(new FuncEventListener());
        order = insert(order, multiplication, 11);
        JButton clear = new JButton("AC");
        //=========================================动作:按下AC按钮清空输入内容==============================================
        clear.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                firstnum=0;
                secondnum=0;
                isFirstnum=true;
                textField.setText("");//还原各值
            }
        });
        order = insert(order, clear, 13);
        JButton equal = new JButton("=");
        //========================================动作:按下等于按钮计算结果=================================================
        equal.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                switch (func)//判断符号,运算出结果
                {
                    case '+' :textField.setText(String.valueOf(firstnum+secondnum));break;
                    case '-' :textField.setText(String.valueOf(firstnum-secondnum));break;
                    case '*' :textField.setText(String.valueOf(firstnum*secondnum));break;
                    case '/' :textField.setText(String.valueOf(firstnum/secondnum));break;
                }
                isFirstnum=true;//还原输入数字的位置,以便连续计算
            }
        });
        //=================================================================================================================
        order = insert(order, equal, 14);
        JButton division = new JButton("/");
        division.addActionListener(new FuncEventListener());
        order = insert(order, division, 15);
        for (JButton button : order) buttonjp.add(button);//以面板插入顺序数组的索引顺序为按钮面板添加按钮
        mainjp.add(buttonjp, BorderLayout.CENTER);//将按钮面板固定在主界面的中心
        this.add(mainjp);//将主界面添加到该窗口
    }

    //为插入数组而写的算法,将某个元素插入数组的某个位置,该位置后的元素依次后移
    //传入值为操作的数组、插入的元素、插入元素的索引,返回值为修改完毕的数组
    private JButton[] insert(JButton[] order, JButton newbutton, int index)
    {
        //元素按照索引顺序依次后移一位,直到检测到索引位置
        for (int i = order.length - 1; i > index; i--) {
            order[i] = order[i - 1];
        }
        order[index] = newbutton;//将索引位置的元素替换为新元素
        return order;//返回修改后的数组
    }

    //数字按钮的按下动作
    class NumEventListener implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            JButton button=(JButton)e.getSource();//得到被按下的按钮
            textField.setText(textField.getText() + button.getText());//连续添加数字,以得到多位数字
            if (isFirstnum) firstnum = Integer.parseInt(textField.getText());//判断输入的位置
            else secondnum = Integer.parseInt(textField.getText());
        }
    }

    //功能按钮(运算符号)的按下动作
    class FuncEventListener implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            JButton button=(JButton)e.getSource();//得到被按下的按钮
            func=button.getText().charAt(0);//将按钮代表的符号存到func变量
            isFirstnum=false;//移动输入位置到第二个操作数
            firstnum=Integer.parseInt(textField.getText());//将目前的值存入第一个操作数,以便连续运算
            textField.setText("");//清空显示框的内容
        }
    }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据