java小测试 -2024/9/30

今天java课进行了一个小测试
测试内容是写一个界面,随机出30道算数题
并能计时,判断得分和正确率
采用JFrame实现窗口,JLabel存储字符串,JTextField存储输入框,并用ArrayList数组记录输入的值和正确答案
并采用计时器的方法计时,在时间到时调用,计算分数的方法
详解

randomMath类

主要的类,显示界面储存所有方法

package login;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Random;

public class randomMath extends JFrame implements MouseListener {

    ArrayList<Integer> ans = new ArrayList<>();
    ArrayList<JTextField> res = new ArrayList<>();
    JLabel pd = new JLabel("查看评分");

    // 程序主体代码
    long startTime,endTime, elapsedTime;

    public randomMath(){
        initJFrame();
        initView();

        this.setVisible(true);

        for (int i = 0; i < ans.size(); i++) {
            System.out.println(ans.get(i));
        }
        startTime = System.currentTimeMillis();
    }


    public void calculateScore(){
        int score = 0;
        for (int i = 0; i < ans.size(); i++) {
            if(ans.get(i).toString().equals(res.get(i).getText())){
                score++;
            }
        }

        double accuracy = score*1.0 / 20;
         endTime = System.currentTimeMillis();
         elapsedTime = endTime - startTime;

        String text = "错题数:" + (20 - score) + "\n" +
                "      你本次用时:\n" + elapsedTime + "毫秒" +
                "      你的正确率为:" + accuracy ;

//        String s = "SELECT t.*\n" +
//                "     FROM lxy.user t\n" +
//                "     LIMIT 501"
        showJDialog(text);
    }

    public void b(){
        MyTimer timer = new MyTimer();
        timer.schedule(new Runnable() {
            @Override
            public void run() {
                //System.out.println("666666");
                calculateScore();
            }
        },10000);
    }


    public void initView() {
        for (int i = 1; i <= 5; i++) {
            for (int j = 1; j <= 4; j++) {
                JLabel j1 = new JLabel(rMath());
                JTextField result = new JTextField();
                result.setBounds(i*150+50,j*80,80,30);
                j1.setBounds(i*150,j*80,80,30);
                this.getContentPane().add(j1);
                this.getContentPane().add(result);
                res.add(result);
            }
        }
        pd.setBounds(450,400,120,30);
        Font font = new Font("Serif",Font.BOLD,20);
        pd.setFont(font);
        this.getContentPane().add(pd);
        pd.addMouseListener(this); //添加鼠标监听
        b();
    }

    public void initJFrame() {
        this.setSize(1000, 600);//设置宽高
        this.setTitle("20道随机计算题");//设置标题
        this.setDefaultCloseOperation(3);//设置关闭模式
        this.setLocationRelativeTo(null);//居中
        this.setAlwaysOnTop(true);//置顶
        this.setLayout(null);//取消内部默认布局
    }

    //设置弹窗
    public void showJDialog(String content) {
        //创建一个弹框对象
        JDialog jDialog = new JDialog();
        //给弹框设置大小
        jDialog.setSize(500, 200);
        //让弹框置顶
        jDialog.setAlwaysOnTop(true);
        //让弹框居中
        jDialog.setLocationRelativeTo(null);
        //弹框不关闭永远无法操作下面的界面
        jDialog.setModal(true);

        //创建Jlabel对象管理文字并添加到弹框当中
        JLabel warning = new JLabel(content);
        warning.setBounds(0, 0, 200, 150);
        jDialog.getContentPane().add(warning);

        //让弹框展示出来
        jDialog.setVisible(true);
    }

    //生成算式
    public String rMath(){
        Random r = new Random();
        Character[] chArr = {'+','-','*','/'};
        int first,second;
        char c;
        while(true){
             first = r.nextInt(100);
             second = r.nextInt(99)+1;
             c = chArr[r.nextInt(4)];
            if(c == '/' && first % second != 0) continue;
            else if(c == '*' && first * second > 999) continue;
            else if(c == '-' && first - second < 0) continue;
            else {
                if(c == '+') ans.add(first + second);
                else if(c == '-') ans.add(first - second);
                else if(c == '*') ans.add(first * second);
                else if(c == '/') ans.add(first / second);
                break;
            }
        }

        String s = (first +""+ c+ "" + second + " = ").toString();
        return s;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if(e.getSource() == pd){
            calculateScore();
        }

    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }
}

MyTImer类

在网上找的计时器

package login;

import java.util.PriorityQueue;

class MyTimer {
    // 使用优先级队列来保存上面的N个任务
    private PriorityQueue<MyTimerTask> queue = new PriorityQueue<>();
    // locker是用来加锁的对象
    private Object locker = new Object();

    // 定时器的核心方法,即把要执行的任务添加到队列中
    public void schedule(Runnable runnable,long delay) {
        synchronized (locker) {
            MyTimerTask task = new MyTimerTask(runnable,delay);
            queue.offer(task);
            // 每次来新的任务之后都会唤醒一下扫描线程,此时扫描线程就可以根据最新的任务情况来重新规划等待时间
            locker.notify();
        }
    }
    // MyTimer类中还需要一个扫描线程,一方面要负责检查队首元素是否是此时应该被执行的。
    // 另一方面,当任务到点开始执行之后,需要调用Runnable中的run方法来完成任务
    public MyTimer() {
        // 扫描线程
        Thread t = new Thread(() -> {
            while(true) {
                try {
                    synchronized(locker) {
                        while(queue.isEmpty()) {
                            // 队列为空时,此时不应该取这里的元素
                            locker.wait();
                        }
                        MyTimerTask task = queue.peek();
                        long curTime = System.currentTimeMillis();
                        if(curTime > task.getTime()) {
                            // 如果当前时间晚于任务的执行时间,就意味着我们要执行这个任务了
                            queue.poll();
                            task.getRunnable().run(); // 至此就可以执行该任务了
                        } else {
                            // 如果当前时间早于任务的执行时间,诶呀太早了,让这个线程(休眠)休息一会一会吧!!!
                            // Thread.sleep(task.getTime() - curTime);
                            locker.wait(task.getTime() - curTime);
                        }
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
    }

}


MyTimerTask类

package login;

class MyTimerTask implements Comparable<MyTimerTask> {
    private long time; // 表示任务什么时候开始执行
    private Runnable runnable; // 表示具体任务是啥

    public MyTimerTask(Runnable runnable,long delay) {
        // delay是一个相对的时间差
        time = System.currentTimeMillis() + delay;// 这里计算出任务执行的具体时间
        this.runnable = runnable;
    }

    public long getTime() {
        return time;
    }

    public Runnable getRunnable() {
        return runnable;
    }


    @Override
    public int compareTo(MyTimerTask o) {
        // 时间最少的元素放在队首,即时间越少优先级越高
        return (int)(this.time - o.time); // time是long类型
    }
}


测试类

package login;

import java.sql.Time;
import java.util.TimerTask;

public class randomMathTest {
    public static void main(String[] args) {
        new randomMath();
    }
}

posted @ 2024-10-01 21:28  XYu1230  阅读(4)  评论(0编辑  收藏  举报