Java大作业

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一、设计思路

在这里插入图片描述

二、代码+分析

登陆界面 class Login extends JFrame

导入的包

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

声明的组件

String s1, s2, s3;//姓名、学号、班级

    JLabel jl1 = new JLabel("小学生计算考试练习系统");
    JLabel jl2 = new JLabel("请填写个人信息");

    JLabel jlName = new JLabel("姓名:");
    JLabel jlID = new JLabel("学号:");
    JLabel jlClass = new JLabel("班级:");
    JLabel jlTime = new JLabel("时间:");
    JLabel jl3 = new JLabel("    ");
    JLabel jl4 = new JLabel("        ");

    JTextField jtName = new JTextField(15);
    JTextField jtID = new JTextField(15);
    JTextField jtClass = new JTextField(15);
    JTextField jtTime = new JTextField(15);

    JButton jb1 = new JButton("开始考试");
    JButton jb2 = new JButton("重置信息");

    JPanel jp1 = new JPanel();
    JPanel jp2 = new JPanel();
    JPanel jp3 = new JPanel();
    JPanel jp4 = new JPanel();
    JPanel jp5 = new JPanel();
    JPanel jp6 = new JPanel();
    JPanel jp7 = new JPanel();
    JPanel jp8 = new JPanel();

这里声明了八个JPanel,分别承载:主标题"小学生计算考试练习系统"、次标题"请填写个人信息"、姓名、学号、班级、自定义时间、面板2~6、”开始考试“和”重置信息“按钮。

Event方法

public void Event(){
        //填写信息
        jb1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //没有输入信息
                if(jtName.getText().equals("") || jtID.getText().equals("") || jtClass.getText().equals("")) {
                    String s = "请输入完整信息";
                    JOptionPane.showMessageDialog(null, s,"提示",JOptionPane.ERROR_MESSAGE);
                }else {
                    setVisible(false);
                    dispose();
                    s1 = jtName.getText();
                    s2 = jtID.getText();
                    s3 = jtClass.getText();
                    new StartTest(Integer.parseInt(jtTime.getText()),s1,s2,s3);
                }
            }
        });
        //重置信息
        jb2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jtName.setText(null);
                jtID.setText(null);
                jtClass.setText(null);
            }
        });
    }

构造器

public Login(){
        super("小学生计算考试练习系统");
        Container c = getContentPane();
        c.setLayout(new BorderLayout(20,20));//间隔20像素

        jl1.setFont(new Font("黑体",Font.BOLD,35));
        jl1.setForeground(Color.BLUE);
        jp1.add(jl1);
        c.add(jp1, BorderLayout.NORTH);

        jl2.setFont(new Font("黑体",Font.BOLD,25));
        jl2.setForeground(Color.red);
        jp2.add(jl2);

        jlName.setFont(new Font("黑体",Font.BOLD,15));
        jp3.add(jlName);
        jp3.add(jtName);

        jlID.setFont(new Font("黑体",Font.BOLD,15));
        jp4.add(jlID);
        jp4.add(jtID);

        jlClass.setFont(new Font("黑体",Font.BOLD,15));
        jp5.add(jlClass);
        jp5.add(jtClass);

        jlTime.setFont(new Font("黑体",Font.BOLD,15));
        jp6.add(jlTime);
        jp6.add(jtTime);


        jp7.add(jp2);
        jp7.add(jp3);
        jp7.add(jp4);
        jp7.add(jp5);
        jp7.add(jp6);
        jp7.setLayout(new GridLayout(5,1));
        c.add(jp7,BorderLayout.CENTER);

        jp8.add(jl4);
        jp8.add(jb1);
        jp8.add(jl3);
        jp8.add(jb2);
        c.add(jp8,BorderLayout.SOUTH);

        Event();
    }
  1. Container c的布局管理器是BorderLayout,并且设置其各部分间隔20像素
  2. 面板jp7采用GridLayout,5行1列,分别是次标题、姓名、学号、班级、自定义时间。将其置于容器的中间CENTER。
  3. 面板jp8默认流布局管理器。将其置于容器的底部SOUTH。

考试界面 class StartTest extends JFrame

导入的包

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

声明的组件

int a, b, c,count = 1;

    String Name, ID, Class;

    JLabel jlPage = new JLabel();//显示第几页
    JLabel jlTotal = new JLabel(" 共5页      ");
    JLabel jlTime = new JLabel("考试时间还剩:");
    JLabel jlMinutes = new JLabel();
    JLabel jlSeconds = new JLabel();

    JButton jb1 = new JButton("提交试卷");
    JButton jb2 = new JButton("首页");
    JButton jb3 = new JButton("上一页");
    JButton jb4 = new JButton("下一页");
    JButton jb5 = new JButton("尾页");

    JLabel[] jlQuestion = new JLabel[50];//50个题目
    JTextField[] jtAnswer = new JTextField[50];//50个考生答案
    int[] answer = new int[50];//50个标准答案
    String[] rightAnswer = new String[50];//50个标准答案
    boolean[] flag = new boolean[50];//对错的标志

    JPanel jp1 = new JPanel();//承载考试时间
    JPanel jp2 = new JPanel();//置于NORTH
    JPanel jp3 = new JPanel();//置于CENTER
    JPanel jp4 = new JPanel();//置于SOUTH

    CardLayout cl = new CardLayout();

    private int time, endTime;

Event 方法

倒计时
Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                int minutes = endTime / 60;
                int seconds = endTime - minutes * 60;
                endTime--;
                jlMinutes.setText("" + minutes + "分");
                jlSeconds.setText("" + seconds + "秒");
                if(endTime == 0) jb1.doClick();//考试时间到,交卷
            }
        },0,1000);
交卷按钮
jb1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                timer.cancel();
                String s1 = "", s2 = "";
                int correctAnswer = 0;
                for(int i = 0; i < 50; i++) {
                    rightAnswer[i] = Integer.toString(answer[i]);
                    if(jtAnswer[i].getText().equals(rightAnswer[i])) {
                        flag[i] = true;
                        correctAnswer++;
                    }
                    else {
                        s1 += jlQuestion[i].getText() + jtAnswer[i].getText()
                                + "   ×       标准答案:" + rightAnswer[i] + "\n";
                                flag[i] = false;
                    }
                    s2 += jlQuestion[i].getText() +
                            "     考生答案:" + jtAnswer[i].getText() +
                            "     标准答案:" + rightAnswer[i] + "      " +
                            (flag[i] ? "√" : "×") + "\n";
                }
                String s="共50道题\n";
                s += "答对" + correctAnswer + "道题\n";
                s += "答错" + (50 - correctAnswer) + "道题\n";
                s += "用时" + (time - endTime) + "秒\n";
                s += "得分" + (correctAnswer * 2) + "分\n";
                JOptionPane.showMessageDialog(null, s,"考试结束",JOptionPane.INFORMATION_MESSAGE);

                s2 += "\n学号:" + ID + "\n姓名:" + Name + "\n班级:" + Class +
                        "\n最终成绩为:" + correctAnswer * 2 + "\n";

                try {
                    FileOutputStream f1 = new FileOutputStream("错题集.txt");
                    FileOutputStream f2 = new FileOutputStream("答题结果.txt");
                    byte[] b1 = s1.getBytes();
                    byte[] b2 = s2.getBytes();
                    f1.write(b1);
                    f1.flush();
                    f1.close();
                    f2.write(b2);
                    f2.flush();
                    f2.close();
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }
        });
首页
jb2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                cl.first(jp3);
                count = 1;
                jlPage.setText("第" + count +"页");
            }
        });
上一页
jb3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if ( count > 1 && count <= 5){
                    cl.previous(jp3);
                    count --;
                }
                else {
                    String s = "已经是第一页";
                    JOptionPane.showMessageDialog(null, s,"提示",JOptionPane.ERROR_MESSAGE);
                };
                jlPage.setText("第" + count + "页");
            }
        });
下一页
jb4.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if ( count >= 1 && count < 5 ) {
                    cl.next(jp3);
                    count ++;
                }
                else {
                    String s = "已经是最后一页";
                    JOptionPane.showMessageDialog(null, s,"提示",JOptionPane.ERROR_MESSAGE);
                };
                jlPage.setText("第" + count + "页");
            }
        });
尾页
jb5.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                cl.last(jp3);
                count = 5;
                jlPage.setText("第" + count +"页");
            }
        });

构造器

public StartTest(int time, String name, String id, String Class){
        super("开始考试");
        this.time = time;
        this.endTime = time;
        this.Name = name;
        this.ID = id;
        this.Class = Class;
        this.setSize(500,500);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(new BorderLayout(20,20));

        jp1.add(jlMinutes);
        jp1.add(jlSeconds);
        jlPage.setText("第" + count + "页");

        jp2.setLayout(new FlowLayout());
        jp2.add(jlPage);//页数
        jp2.add(jlTotal);
        jp2.add(jlTime);
        jp2.add(jp1);
        jp2.add(jb1);
        this.add(jp2,BorderLayout.NORTH);

        jp3.setLayout(cl);
        this.add(jp3,BorderLayout.CENTER);

        for (int i = 0, k = 0; i < 5; i++) {
            JPanel p = new JPanel(new GridLayout(10,2));
            for(int j = 0 ; j < 10 ; j++) {
                a = (int)(Math.random()*100+1);
                b = (int)(Math.random()*100+1);
                c = (int)(Math.random()*100+1);
                while(a + b < c) c = (int)(Math.random()*100+1);

                jlQuestion[k] = new JLabel("" + (k+1) + "、 " + a + "+" + b + "-" + c + "=");
                jlQuestion[k].setFont(new Font("黑体",Font.BOLD,15));
                p.add(jlQuestion[k]);
                answer[k] = a + b - c;

                jtAnswer[k] = new JTextField();
                p.add(jtAnswer[k]);

                k++;
            }
            JScrollPane sp = new JScrollPane(p);
            jp3.add(sp);
        }

        jp4.setLayout(new GridLayout(1,4));
        jp4.add(jb2);
        jp4.add(jb3);
        jp4.add(jb4);
        jp4.add(jb5);

        this.add(jp4, BorderLayout.SOUTH);

        Event();

        this.setVisible(true);
    }

三、最终演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
错题集:
在这里插入图片描述
答题情况:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值