JavaSwing实现简陋计算器和出题器

1.概要

使用JavaSwing进行界面搭建,使用Java提供的特定函数来实现解析表达式运算的目的,使用Math.rondom()方法来实现随机出题,不考虑什么性能和安全之类,咱就是说功能先给他弄出来。

布局:

结果:


2.一些问题的处理
输入输出问题:输入使用JTextField进行输入框输入,利用其getText()方法返回String类型

 
算数运算问题:首先,生成脚本引擎实例,使用引擎的eval()函数解析字符串表达式,返回计算结果,根据不同情况来转化数据类型,最后使用Math.abs()方法进行差值比较验证答案,输出对应文字表达。


输入框光标驻留问题:点击按钮触发事件时,输入框可以输入,但失去了光标,不利于用户,我们可以再加入两个int型变量记录按钮被点击时光标最后停留的文本区域和光标坐标,按钮事件先进行操作,按钮事件最后一步是返还光标----------先让文本使用requestFocus(),再用setCaretPosition()设置光标位置,这样看起来就像光标驻留在了某个特定位置了,具体参见代码行159~202行注意:点击按钮,文本区失去焦点这个过程,是先触发文本区的失去焦点事件,再触发按钮的点击事件!!(有点离谱对吧,可以自己输出试试);光标计数从左到右,从0开始。


输入框内容修改问题:利用StringBuilder类来进行修改和作为缓冲,点击按钮后先获取当前文本区内容,再根据光标位置进行内容追加(防止用户先用键盘输入再用数字键盘输入),最后使用StringBuild中的toString方法返回字符串,这个字符串又当作文本JTextField类型中setText()方法的参数即可。


提示和换行问题:JLabel中输入的String类型可包含HTML表达,使用简单的表达可以达到换行加粗标红等基本处理。


注意事项:

Ⅰ.请使用Java1.8(即java8)运行程序,高版本的Java删除了代码中使用的部分api(例如Java17.0.3就不能良好运行本程序)
Ⅱ.文件代码中包含部分中文注释,可使用"javac -encoding UTF-8 CalculatorDemo.java"来解决
Ⅲ.双击jar文件使用的版本不一定是java1.8请注意(可能安装了多个版本,注册表可能有选择问题)
Ⅳ.图片资源放在与.java文件同一个文件夹下,且名字为dance.gif,不需要图片就将代码行78~80,82注释即可(不注释也完全没问题),或者你把你图片放相同位置改一下这几行代码,没图并不影响运行,只是不显示。
3.代码如下

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;

//计算引入(没有自己写,直接调用去了)
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class CalculatorDemo {
    // 类的全局变量区
    String messageLabelHelpString = "<html><body><h1 style=\"text-align:center;\">提示</h1><br>1.第一个框是计算框,输入计算式或者按出来,自由输入时才允许使用括号,键盘上没有。<br>2.第二个框是你答案的输入框,下面是结果提示区。<br>3.等号与确认键相同,看不见全文就全屏.<br>4.输入错误就鼠标点击直接修改,或者点击等号清屏重写。<br><div style=\"color:red;\">5.注意!当小数位数多于5位时,计算机可能出现误差,判定标准为你的答案与计算机结果误差小于0.0000000000001时回答正确!</div><br></body></html>";// 使用html表达提示区
    int choiceText_flag = 0;// 两个文本框被选定的情况
    int lastCaretposition = 0;// 记录光标最后停留位置
    StringBuilder buffer1 = new StringBuilder();// 修改两个文本区的字符串所用的stringbuilder缓冲区
    StringBuilder buffer2 = new StringBuilder();
    JFrame contentPane;//最大的Fram框架
    JPanel base;//JPanel容器,它包含了接下来使用的其他JPanel容器等中间容器
    JLabel messageLabel;//消息框
    JTextField textFieldInputText_1;//输入文本1
    JTextField textFieldInputText_2;//输入文本2
    ScriptEngineManager manager = new ScriptEngineManager();// 创建脚本执行引擎
    ScriptEngine engine = manager.getEngineByName("js");// 初始化,写js,或者JavaScript,或者javascript等特定名称

    // 构造函数
    public CalculatorDemo() {
        CalculatorDemo();//调用界面生成函数
    }

    private void CalculatorDemo()// 界面调用函数(生成)
    {
        contentPane = new JFrame("计算器和出题机"); // 创建窗体,标记窗体名
        contentPane.setBounds(100, 100, 400, 700); // 设置窗体位置和大小
        contentPane.addWindowListener(new WindowAdapter() {// 创建窗口事件监听
            public void windowClosing(WindowEvent windowEvent) {// 窗口关闭事件
                System.exit(0);//
            }
        });
        base = new JPanel();// 创建内容面板(零级div)
        base.setLayout(new BorderLayout(0, 0)); // 设置内容面板为边界布局
        base.setBorder(new EmptyBorder(5, 5, 5, 5));// 设置边界间隔值为5像素
        contentPane.add(base);// 添加基本div

        // ...........................................................
        JPanel panelText = new JPanel(); // 新建面板用于保存文本框
        panelText.setLayout(new BorderLayout(0, 0));
        base.add(panelText, BorderLayout.NORTH); // 将面板放置在边界布局的北部
        textFieldInputText_1 = new JTextField(); // 新建文本框(输入框)
        textFieldInputText_2 = new JTextField(); // 新建文本框(输入框)
        // textFieldInputText_1.set();//尝试修改间隔
        messageLabel = new JLabel("这里是结果默认输出框位,第二个框输入答案喔ლ(╹ε╹ლ) ");// 新建信息框(输出框----label型)

        textFieldInputText_1.setHorizontalAlignment(SwingConstants.RIGHT); // 文本框中的文本使用右对齐
        textFieldInputText_2.setHorizontalAlignment(SwingConstants.RIGHT); // 文本框中的文本使用右对齐
        messageLabel.setHorizontalAlignment(SwingConstants.CENTER);// 消息格式居中
        textFieldInputText_1.setColumns(18); // 设置文本框的列数是18
        textFieldInputText_2.setColumns(18); // 设置文本框的列数是18

        panelText.add(textFieldInputText_1, BorderLayout.NORTH); // 将文本框增加到面板中
        panelText.add(textFieldInputText_2, BorderLayout.CENTER); // 将文本框增加到面板中
        panelText.add(messageLabel, BorderLayout.SOUTH); // 将文本框增加到面板中

        // ...........................................................
        JPanel otherAreas = new JPanel(); // 新建面板用于保存按钮(一级div)
        base.add(otherAreas, BorderLayout.CENTER); // 将面板放置在边界布局的中央
        otherAreas.setLayout(new BorderLayout(0, 0)); // 使用边界布局

        JPanel buttons = new JPanel(); // 新建面板用于保存按钮(二级div)
        buttons.setLayout(new GridLayout(5, 5, 5, 5)); // 面板使用网格4X4布局,存放按钮

        JPanel message_picture_random = new JPanel(); // 新建面板用于保存按钮(二级div)
        message_picture_random.setLayout(new BorderLayout(0, 0)); // 使用边界布局
        JButton buttonRandom = new JButton("随机出题"); // 新建按钮
        JLabel messageLabelHelp = new JLabel(messageLabelHelpString);// 新建信息帮助框
        messageLabelHelp.setHorizontalAlignment(SwingConstants.CENTER);// 消息格式居中
        ImageIcon image = new ImageIcon(
                new ImageIcon("dance.gif").getImage().getScaledInstance(250, 152, Image.SCALE_DEFAULT));// 更改图片规格
        JLabel picture = new JLabel(image);// 新建图片框
        message_picture_random.add(messageLabelHelp, BorderLayout.NORTH); // 应用提示栏位
        message_picture_random.add(picture, BorderLayout.CENTER); // 应用图片栏位
        message_picture_random.add(buttonRandom, BorderLayout.SOUTH); // 应用按钮

        otherAreas.add(buttons, BorderLayout.NORTH);// 添加到pane2中
        otherAreas.add(message_picture_random, BorderLayout.SOUTH);// 添加到pane2中

        // 这是一群按钮,顺序添加
        JButton button01 = new JButton("7"); // 新建按钮
        buttons.add(button01); // 应用按钮
        JButton button02 = new JButton("8"); // 新建按钮
        buttons.add(button02); // 应用按钮
        JButton button03 = new JButton("9"); // 新建按钮
        buttons.add(button03); // 应用按钮
        JButton button04 = new JButton("+"); // 新建按钮
        buttons.add(button04); // 应用按钮
        JButton button05 = new JButton("4"); // 新建按钮
        buttons.add(button05); // 应用按钮
        JButton button06 = new JButton("5"); // 新建按钮
        buttons.add(button06); // 应用按钮
        JButton button07 = new JButton("6"); // 新建按钮
        buttons.add(button07); // 应用按钮
        JButton button08 = new JButton("-"); // 新建按钮
        buttons.add(button08); // 应用按钮
        JButton button09 = new JButton("3"); // 新建按钮
        buttons.add(button09); // 应用按钮
        JButton button10 = new JButton("2"); // 新建按钮
        buttons.add(button10); // 应用按钮
        JButton button11 = new JButton("1"); // 新建按钮
        buttons.add(button11); // 应用按钮
        JButton button12 = new JButton("*"); // 新建按钮
        buttons.add(button12); // 应用按钮
        JButton button13 = new JButton("0"); // 新建按钮
        buttons.add(button13); // 应用按钮
        JButton button14 = new JButton("."); // 新建按钮
        buttons.add(button14); // 应用按钮
        JButton button15 = new JButton("="); // 新建按钮
        buttons.add(button15); // 应用按钮
        JButton button16 = new JButton("/"); // 新建按钮
        buttons.add(button16); // 应用按钮
        contentPane.setVisible(true);

        // 布局结束,现在开始监听与事件处理
        button01.addActionListener(new ButtonClickListener());// 为按钮添加点击事件
        button02.addActionListener(new ButtonClickListener());// 为按钮添加点击事件
        button03.addActionListener(new ButtonClickListener());// 为按钮添加点击事件
        button04.addActionListener(new ButtonClickListener());// 为按钮添加点击事件
        button05.addActionListener(new ButtonClickListener());// 为按钮添加点击事件
        button06.addActionListener(new ButtonClickListener());// 为按钮添加点击事件
        button07.addActionListener(new ButtonClickListener());// 为按钮添加点击事件
        button08.addActionListener(new ButtonClickListener());// 为按钮添加点击事件
        button09.addActionListener(new ButtonClickListener());// 为按钮添加点击事件
        button10.addActionListener(new ButtonClickListener());// 为按钮添加点击事件
        button11.addActionListener(new ButtonClickListener());// 为按钮添加点击事件
        button12.addActionListener(new ButtonClickListener());// 为按钮添加点击事件
        button13.addActionListener(new ButtonClickListener());// 为按钮添加点击事件
        button14.addActionListener(new ButtonClickListener());// 为按钮添加点击事件
        button15.addActionListener(new ButtonClickListener());// 为按钮添加点击事件
        button16.addActionListener(new ButtonClickListener());// 为按钮添加点击事件
        buttonRandom.addActionListener(new ButtonClickListener());// 为按钮添加点击事件

        button01.setActionCommand("7");// 设置信息
        button02.setActionCommand("8");
        button03.setActionCommand("9");
        button04.setActionCommand("+");
        button05.setActionCommand("4");
        button06.setActionCommand("5");
        button07.setActionCommand("6");
        button08.setActionCommand("-");
        button09.setActionCommand("3");
        button10.setActionCommand("2");
        button11.setActionCommand("1");
        button12.setActionCommand("*");
        button13.setActionCommand("0");
        button14.setActionCommand(".");
        button15.setActionCommand("=");
        button16.setActionCommand("/");
        buttonRandom.setActionCommand("Random");
        textFieldInputText_1.addFocusListener(new FocusListener() {// 设置表达区焦点监听
            public void focusGained(FocusEvent e) {
            }

            public void focusLost(FocusEvent e) {
                choiceText_flag = 1;
                lastCaretposition = textFieldInputText_1.getCaretPosition();// 获取光标最后停留位置
                lastCaretposition++;// 光标位置自增
            }
        });
        textFieldInputText_2.addFocusListener(new FocusListener() {// 设置输入区焦点监听
            public void focusGained(FocusEvent e) {
            }

            public void focusLost(FocusEvent e) {
                // System.out.println("先失去焦点");
                choiceText_flag = 2;
                lastCaretposition = textFieldInputText_2.getCaretPosition();// 获取光标最后停留位置
                lastCaretposition++;// 光标位置自增
            }
        });
    }

    // 事件处理函数,处理事件
    // 事件先失去焦点,再触发按钮
    private class ButtonClickListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {// 按钮激活后的行为
            String command = e.getActionCommand();// 获取按钮信息
            if (command.equals("1")) {// 做出行为
                if (choiceText_flag == 1) {
                    // System.out.println("先按钮触发");
                    buffer1.replace(0, buffer1.length(), textFieldInputText_1.getText());
                    buffer1.insert(lastCaretposition - 1, "1");// 信息追加
                    textFieldInputText_1.setText(buffer1.toString());// 刷新文本区内容
                    textFieldInputText_1.requestFocus();// 重新获得焦点
                    textFieldInputText_1.setCaretPosition(lastCaretposition);// 刷新光标位置
                } else if (choiceText_flag == 2) {
                    buffer2.replace(0, buffer2.length(), textFieldInputText_2.getText());
                    buffer2.insert(lastCaretposition - 1, "1");// 信息追加
                    textFieldInputText_2.setText(buffer2.toString());// 刷新文本区内容
                    textFieldInputText_2.requestFocus();
                    textFieldInputText_2.setCaretPosition(lastCaretposition);
                }
            } else if (command.equals("2")) {
                if (choiceText_flag == 1) {
                    buffer1.replace(0, buffer1.length(), textFieldInputText_1.getText());
                    buffer1.insert(lastCaretposition - 1, "2");// 信息追加
                    textFieldInputText_1.setText(buffer1.toString());// 刷新文本区内容
                    textFieldInputText_1.requestFocus();
                    textFieldInputText_1.setCaretPosition(lastCaretposition);
                } else if (choiceText_flag == 2) {
                    buffer2.replace(0, buffer2.length(), textFieldInputText_2.getText());
                    buffer2.insert(lastCaretposition - 1, "2");// 信息追加
                    textFieldInputText_2.setText(buffer2.toString());// 刷新文本区内容
                    textFieldInputText_2.requestFocus();
                    textFieldInputText_2.setCaretPosition(lastCaretposition);
                }
            } else if (command.equals("3")) {
                if (choiceText_flag == 1) {
                    buffer1.replace(0, buffer1.length(), textFieldInputText_1.getText());
                    buffer1.insert(lastCaretposition - 1, "3");// 信息追加
                    textFieldInputText_1.setText(buffer1.toString());// 刷新文本区内容
                    textFieldInputText_1.requestFocus();// 重新获得焦点
                    textFieldInputText_1.setCaretPosition(lastCaretposition);// 刷新光标位置
                } else if (choiceText_flag == 2) {
                    buffer2.replace(0, buffer2.length(), textFieldInputText_2.getText());
                    buffer2.insert(lastCaretposition - 1, "3");// 信息追加
                    textFieldInputText_2.setText(buffer2.toString());// 刷新文本区内容
                    textFieldInputText_2.requestFocus();
                    textFieldInputText_2.setCaretPosition(lastCaretposition);
                }
            } else if (command.equals("4")) {
                if (choiceText_flag == 1) {
                    buffer1.replace(0, buffer1.length(), textFieldInputText_1.getText());
                    buffer1.insert(lastCaretposition - 1, "4");// 信息追加
                    textFieldInputText_1.setText(buffer1.toString());// 刷新文本区内容
                    textFieldInputText_1.requestFocus();// 重新获得焦点
                    textFieldInputText_1.setCaretPosition(lastCaretposition);// 刷新光标位置
                } else if (choiceText_flag == 2) {
                    buffer2.replace(0, buffer2.length(), textFieldInputText_2.getText());
                    buffer2.insert(lastCaretposition - 1, "4");// 信息追加
                    textFieldInputText_2.setText(buffer2.toString());// 刷新文本区内容
                    textFieldInputText_2.requestFocus();
                    textFieldInputText_2.setCaretPosition(lastCaretposition);
                }
            } else if (command.equals("5")) {
                if (choiceText_flag == 1) {
                    buffer1.replace(0, buffer1.length(), textFieldInputText_1.getText());
                    buffer1.insert(lastCaretposition - 1, "5");// 信息追加
                    textFieldInputText_1.setText(buffer1.toString());// 刷新文本区内容
                    textFieldInputText_1.requestFocus();// 重新获得焦点
                    textFieldInputText_1.setCaretPosition(lastCaretposition);// 刷新光标位置
                } else if (choiceText_flag == 2) {
                    buffer2.replace(0, buffer2.length(), textFieldInputText_2.getText());
                    buffer2.insert(lastCaretposition - 1, "5");// 信息追加
                    textFieldInputText_2.setText(buffer2.toString());// 刷新文本区内容
                    textFieldInputText_2.requestFocus();
                    textFieldInputText_2.setCaretPosition(lastCaretposition);
                }
            } else if (command.equals("6")) {
                if (choiceText_flag == 1) {
                    buffer1.replace(0, buffer1.length(), textFieldInputText_1.getText());
                    buffer1.insert(lastCaretposition - 1, "6");// 信息追加
                    textFieldInputText_1.setText(buffer1.toString());// 刷新文本区内容
                    textFieldInputText_1.requestFocus();// 重新获得焦点
                    textFieldInputText_1.setCaretPosition(lastCaretposition);// 刷新光标位置
                } else if (choiceText_flag == 2) {
                    buffer2.replace(0, buffer2.length(), textFieldInputText_2.getText());
                    buffer2.insert(lastCaretposition - 1, "6");// 信息追加
                    textFieldInputText_2.setText(buffer2.toString());// 刷新文本区内容
                    textFieldInputText_2.requestFocus();
                    textFieldInputText_2.setCaretPosition(lastCaretposition);
                }
            } else if (command.equals("7")) {
                if (choiceText_flag == 1) {
                    buffer1.replace(0, buffer1.length(), textFieldInputText_1.getText());
                    buffer1.insert(lastCaretposition - 1, "7");// 信息追加
                    textFieldInputText_1.setText(buffer1.toString());// 刷新文本区内容
                    textFieldInputText_1.requestFocus();// 重新获得焦点
                    textFieldInputText_1.setCaretPosition(lastCaretposition);// 刷新光标位置
                } else if (choiceText_flag == 2) {
                    buffer2.replace(0, buffer2.length(), textFieldInputText_2.getText());
                    buffer2.insert(lastCaretposition - 1, "7");// 信息追加
                    textFieldInputText_2.setText(buffer2.toString());// 刷新文本区内容
                    textFieldInputText_2.requestFocus();
                    textFieldInputText_2.setCaretPosition(lastCaretposition);
                }
            } else if (command.equals("8")) {
                if (choiceText_flag == 1) {
                    buffer1.replace(0, buffer1.length(), textFieldInputText_1.getText());
                    buffer1.insert(lastCaretposition - 1, "8");// 信息追加
                    textFieldInputText_1.setText(buffer1.toString());// 刷新文本区内容
                    textFieldInputText_1.requestFocus();// 重新获得焦点
                    textFieldInputText_1.setCaretPosition(lastCaretposition);// 刷新光标位置
                } else if (choiceText_flag == 2) {
                    buffer2.replace(0, buffer2.length(), textFieldInputText_2.getText());
                    buffer2.insert(lastCaretposition - 1, "8");// 信息追加
                    textFieldInputText_2.setText(buffer2.toString());// 刷新文本区内容
                    textFieldInputText_2.requestFocus();
                    textFieldInputText_2.setCaretPosition(lastCaretposition);
                }
            } else if (command.equals("9")) {
                if (choiceText_flag == 1) {
                    buffer1.replace(0, buffer1.length(), textFieldInputText_1.getText());
                    buffer1.insert(lastCaretposition - 1, "9");// 信息追加
                    textFieldInputText_1.setText(buffer1.toString());// 刷新文本区内容
                    textFieldInputText_1.requestFocus();// 重新获得焦点
                    textFieldInputText_1.setCaretPosition(lastCaretposition);// 刷新光标位置
                } else if (choiceText_flag == 2) {
                    buffer2.replace(0, buffer2.length(), textFieldInputText_2.getText());
                    buffer2.insert(lastCaretposition - 1, "9");// 信息追加
                    textFieldInputText_2.setText(buffer2.toString());// 刷新文本区内容
                    textFieldInputText_2.requestFocus();
                    textFieldInputText_2.setCaretPosition(lastCaretposition);
                }
            } else if (command.equals("0")) {
                if (choiceText_flag == 1) {
                    buffer1.replace(0, buffer1.length(), textFieldInputText_1.getText());
                    buffer1.insert(lastCaretposition - 1, "0");// 信息追加
                    textFieldInputText_1.setText(buffer1.toString());// 刷新文本区内容
                    textFieldInputText_1.requestFocus();// 重新获得焦点
                    textFieldInputText_1.setCaretPosition(lastCaretposition);// 刷新光标位置
                } else if (choiceText_flag == 2) {
                    buffer2.replace(0, buffer2.length(), textFieldInputText_2.getText());
                    buffer2.insert(lastCaretposition - 1, "0");// 信息追加
                    textFieldInputText_2.setText(buffer2.toString());// 刷新文本区内容
                    textFieldInputText_2.requestFocus();
                    textFieldInputText_2.setCaretPosition(lastCaretposition);
                }
            } else if (command.equals("+")) {
                if (choiceText_flag == 1) {
                    buffer1.replace(0, buffer1.length(), textFieldInputText_1.getText());
                    buffer1.insert(lastCaretposition - 1, "+");// 信息追加
                    textFieldInputText_1.setText(buffer1.toString());// 刷新文本区内容
                    textFieldInputText_1.requestFocus();// 重新获得焦点
                    textFieldInputText_1.setCaretPosition(lastCaretposition);// 刷新光标位置
                } else if (choiceText_flag == 2) {
                    buffer2.replace(0, buffer2.length(), textFieldInputText_2.getText());
                    buffer2.insert(lastCaretposition - 1, "+");// 信息追加
                    textFieldInputText_2.setText(buffer2.toString());// 刷新文本区内容
                    textFieldInputText_2.requestFocus();
                    textFieldInputText_2.setCaretPosition(lastCaretposition);
                }
            } else if (command.equals("-")) {
                if (choiceText_flag == 1) {
                    buffer1.replace(0, buffer1.length(), textFieldInputText_1.getText());
                    buffer1.insert(lastCaretposition - 1, "-");// 信息追加
                    textFieldInputText_1.setText(buffer1.toString());// 刷新文本区内容
                    textFieldInputText_1.requestFocus();// 重新获得焦点
                    textFieldInputText_1.setCaretPosition(lastCaretposition);// 刷新光标位置
                } else if (choiceText_flag == 2) {
                    buffer2.replace(0, buffer2.length(), textFieldInputText_2.getText());
                    buffer2.insert(lastCaretposition - 1, "-");// 信息追加
                    textFieldInputText_2.setText(buffer2.toString());// 刷新文本区内容
                    textFieldInputText_2.requestFocus();
                    textFieldInputText_2.setCaretPosition(lastCaretposition);
                }
            } else if (command.equals("*")) {
                if (choiceText_flag == 1) {
                    buffer1.replace(0, buffer1.length(), textFieldInputText_1.getText());
                    buffer1.insert(lastCaretposition - 1, "*");// 信息追加
                    textFieldInputText_1.setText(buffer1.toString());// 刷新文本区内容
                    textFieldInputText_1.requestFocus();// 重新获得焦点
                    textFieldInputText_1.setCaretPosition(lastCaretposition);// 刷新光标位置
                } else if (choiceText_flag == 2) {
                    buffer2.replace(0, buffer2.length(), textFieldInputText_2.getText());
                    buffer2.insert(lastCaretposition - 1, "*");// 信息追加
                    textFieldInputText_2.setText(buffer2.toString());// 刷新文本区内容
                    textFieldInputText_2.requestFocus();
                    textFieldInputText_2.setCaretPosition(lastCaretposition);
                }
            } else if (command.equals("/")) {
                if (choiceText_flag == 1) {
                    buffer1.replace(0, buffer1.length(), textFieldInputText_1.getText());
                    buffer1.insert(lastCaretposition - 1, "/");// 信息追加
                    textFieldInputText_1.setText(buffer1.toString());// 刷新文本区内容
                    textFieldInputText_1.requestFocus();// 重新获得焦点
                    textFieldInputText_1.setCaretPosition(lastCaretposition);// 刷新光标位置
                } else if (choiceText_flag == 2) {
                    buffer2.replace(0, buffer2.length(), textFieldInputText_2.getText());
                    buffer2.insert(lastCaretposition - 1, "/");// 信息追加
                    textFieldInputText_2.setText(buffer2.toString());// 刷新文本区内容
                    textFieldInputText_2.requestFocus();
                    textFieldInputText_2.setCaretPosition(lastCaretposition);
                }
            } else if (command.equals(".")) {
                if (choiceText_flag == 1) {
                    buffer1.replace(0, buffer1.length(), textFieldInputText_1.getText());
                    buffer1.insert(lastCaretposition - 1, ".");// 信息追加
                    textFieldInputText_1.setText(buffer1.toString());// 刷新文本区内容
                    textFieldInputText_1.requestFocus();// 重新获得焦点
                    textFieldInputText_1.setCaretPosition(lastCaretposition);// 刷新光标位置
                } else if (choiceText_flag == 2) {
                    buffer2.replace(0, buffer2.length(), textFieldInputText_2.getText());
                    buffer2.insert(lastCaretposition - 1, ".");// 信息追加
                    textFieldInputText_2.setText(buffer2.toString());// 刷新文本区内容
                    textFieldInputText_2.requestFocus();
                    textFieldInputText_2.setCaretPosition(lastCaretposition);
                }
            } else if (command.equals("=")) {
                try {//try-catch语句捕捉错误提示
                    String s3;// 中间件
                    if (Math.abs(((engine.eval(textFieldInputText_1.getText()) instanceof Integer)
                            ? (int) engine.eval(textFieldInputText_1.getText())
                            : (double) engine.eval(textFieldInputText_1.getText()))
                            - ((engine.eval(textFieldInputText_2.getText()) instanceof Integer)
                                    ? (int) engine.eval(textFieldInputText_2.getText())
                                    : (double) engine.eval(textFieldInputText_2.getText()))) < 0.0000000000001)
                        s3 = "在计算机误差范围内,回答正确";// 使用Maath.abs()方法比较答案差距
                    else
                        s3 = "回答错误";
                    messageLabel.setText(
                            "答案是:" + engine.eval(textFieldInputText_1.getText()) + "   你的答案是:"
                                    + engine.eval(textFieldInputText_2.getText()) + s3);// 拼接输出字符串
                } catch (NullPointerException ex) {
                    messageLabel.setText("输入框留空(或者使用了非java8的运行环境)");
                } catch (ScriptException ex) {
                    messageLabel.setText("输入错误");

                }
                buffer1.delete(0, buffer1.length());// 算术表达式内容清空
                buffer2.delete(0, buffer1.length());// 答题内容清空
                textFieldInputText_1.setText("");// 算式区内容清空
                textFieldInputText_2.setText("");// 答题区内容清空
                lastCaretposition = 0;// 光标数据清空
                textFieldInputText_1.requestFocus();// 焦点锁定回第一输入框

            } else {
                // 随机出题,两位小数的数据加减乘除,整数基本概率为0
                double guesschoice = Math.random();
                String guess;
                if (guesschoice > 0 && guesschoice < 0.25) {
                    guess = String.format("%.2f", Math.random() * 100 * Math.random()) + "+"
                            + String.format("%.2f", Math.random() * 100 * Math.random());
                } else if (guesschoice >= 0.25 && guesschoice < 0.5) {
                    guess = String.format("%.2f", Math.random() * 100 * Math.random()) + "-"
                            + String.format("%.2f", Math.random() * 100 * Math.random());
                } else if (guesschoice >= 0.5 && guesschoice < 0.75) {
                    guess = String.format("%.2f", Math.random() * 100 * Math.random()) + "*"
                            + String.format("%.2f", Math.random() * 100 * Math.random());
                } else {
                    guess = String.format("%.2f", Math.random() * 100 * Math.random()) + "/"
                            + String.format("%.2f", Math.random() * 100 * Math.random());
                }
                textFieldInputText_1.setText(guess);// 输出题目到第一个栏位
                messageLabel.setText("随机出题");// 信息提示

            }
        }
    }

    // ...........................................................
    public static void main(String[] args) {
        CalculatorDemo frame = new CalculatorDemo();// 关于什么安全性问题,咱就不考虑了,偷懒了,最后才注意到,懒得改了,直接生成算了。
    }
}


4.参考文档和图片引用

布局管理:(7条消息) Java-Swing编程介绍_cb_east的博客-CSDN博客_java swinghttps://blog.csdn.net/cb_east/article/details/79949415

界面参考:(7条消息) java 计算器swing_Java Swing计算器界面的实现_weixin_26642481的博客-CSDN博客https://blog.csdn.net/weixin_26642481/article/details/114062147事件处理:

(7条消息) java swing 事件_Swing事件处理_carwinloo的博客-CSDN博客https://blog.csdn.net/weixin_29997937/article/details/114479025光标处理:

(7条消息) java jtextfield 光标_JTextField添加焦点监听时设置光标可用性及位置_FieryTiger的博客-CSDN博客https://blog.csdn.net/weixin_29870701/article/details/114133644(7条消息) java JTextField编辑框自动获取焦点光标,以及对编辑框内容监听_阳光灿烂的夜的博客-CSDN博客https://blog.csdn.net/qq_38629981/article/details/107110307?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-107110307-blog-114133644.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-107110307-blog-114133644.pc_relevant_paycolumn_v3&utm_relevant_index=1

 字符串表达式:

(7条消息) Java解析字符串计算表达式_18岁的许嵩的博客-CSDN博客_java解析字符串数学公式https://blog.csdn.net/qq_31283333/article/details/108088566javaScriptEngine使用(支持JavaScript脚本,eval()函数等) - 百度文库 (baidu.com)https://wenku.baidu.com/view/84b0b309ccc789eb172ded630b1c59eef8c79a82.html图片插入

请教:如何在JLabel上显示图片,并且图片自适应jLabel的大小_百度知道 (baidu.com)https://zhidao.baidu.com/question/557064096.html图片引用源(作者主页)

挲夜的个人空间_哔哩哔哩_bilibilihttps://space.bilibili.com/6994502

HTML表达

HTML 教程 | 菜鸟教程 (runoob.com)https://www.runoob.com/html/html-tutorial.htmljar包导出

(7条消息) VSCode导出jar(超简单)_gggg达的博客-CSDN博客_vscode 打包jarhttps://blog.csdn.net/weixin_43798842/article/details/118936341?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-1-118936341-null-null.pc_agg_new_rank&utm_term=vscode%E9%A1%B9%E7%9B%AE%E6%89%93%E5%8C%85jar%E8%BF%90%E8%A1%8C&spm=1000.2123.3001.4430Java语句表达参考书籍《Java语言程序设计与数据结构

欢迎评论区指出不足之处,谢绝打赏。

以上如有侵权,请联系删除。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值