Java——一个使用Java Swing实现的考试系统的窗体类

这是一个使用Java Swing实现的考试系统的窗体类。主要包括菜单栏、题目内容、选项、按钮等组件,并且实现了开始考试、上一题、下一题和提交按钮的功能。

在窗体的构造方法中,设置了窗体的标题、大小和位置,并调用了init方法和setVisible方法。init方法用于设置初始界面的组件布局,包括菜单栏和面板。setVisible方法用于显示窗体。

在init方法中,创建了菜单栏和菜单项,并添加到窗体的菜单栏中。创建了面板,并设置了网格布局。接下来,在面板中添加了题目内容的标签、四个选项的单选按钮和按钮组组件,并将面板添加到窗体中。

在init2方法中,设置了考试时的组件布局。创建了题目内容的标签、四个选项的单选按钮和按钮组组件,并添加到面板中。为上一题、下一题和提交按钮添加了点击事件监听器,实现了相应的功能。

getContent方法用于读取指定题目的内容,并将其显示在面板的组件中。save方法用于保存用户选择的答案。main方法用

package text;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.*;//设置主窗体
public class ExamJFrame extends JFrame {JMenuBar jmb;JMenu jm,jc1,jc2,jc3,jc4;JMenuItem jmi1;JPanel jp1;JLabel jlb;//题目JRadioButton jr1,jr2,jr3,jr4;//四个选项的单选按钮JButton jb1,jb2,jb3;JPanel jp2;ButtonGroup bg;ArrayList<Test> list;int index;//当前题目的索引值Test test;ExamJFrame(){setTitle("考试系统");setBounds(400,300,500,400);init();setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true);//单击开始考试,显示面板内容jmi1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {jp1.removeAll();init2();list=ExamRead.read("C:\\Users\\zjl\\eclipse-workspace\\text\\src\\timu.txt");getContent(index);index = 0;jb1.setEnabled(false);jp1.revalidate();jb3.setEnabled(true);}});}//设置初始界面public void init() {jmb=new JMenuBar();jm=new JMenu("考试");jc1=new JMenu("等级");jc2=new JMenu("帮助");jc3=new JMenu("退出");jc4=new JMenu("切换背景颜色");jmi1=new JMenuItem("开始考试");jm.add(jmi1);jmb.add(jm);jmb.add(jc1);jmb.add(jc2);jmb.add(jc3);jmb.add(jc4);setJMenuBar(jmb);jp1=new JPanel();//设置面板的布局为网格布局,只有一列jp1.setLayout(new GridLayout(0,1));add(jp1);}//考试时候的组件布局public void init2() {jlb=new JLabel("1.关于throws关键字的说明,正确的说法是()。");jr1=new JRadioButton("A.throws用于抛出异常");jr2=new JRadioButton("B.throws用于声明抛出异常");jr3=new JRadioButton("C.throws只能声明抛出受检查异常");jr4=new JRadioButton("D.throws声明抛出的异常都必须捕获处理");//单选按钮要实现互相排斥,多选一,ButtonGroup按钮组bg=new ButtonGroup();bg.add(jr1);bg.add(jr2);bg.add(jr3);bg.add(jr4);jp2=new JPanel();jb1=new JButton("上一题");jb2=new JButton("下一题");jb3=new JButton("提交");jp2.add(jb1);jp2.add(jb2);jp2.add(jb3);//滚动条面板添加jlbjp1.add(new JScrollPane(jlb));jp1.add(jr1);jp1.add(jr2);jp1.add(jr3);jp1.add(jr4);jp1.add(jp2);//上一题按钮的操作jb1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {//保存用户的选项save(index);//index要实现减一index--;//显示index题的内容到面板getContent(index);//如果已经到达第一题,则将上一题按钮设置为不可用if(index == 0) {jb1.setEnabled(false);}//下一题按钮使用jb2.setEnabled(true);}});//下一题按钮的操作jb2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {//保存用户的选项save(index);//index要实现加一index++;//显示index题的内容到面板getContent(index);if(index == list.size()-1) {jb2.setEnabled(false);}jb1.setEnabled(true);}});//提交按钮的操作jb3.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {//最后一道题答案的保存save(index);//遍历list集合的每一个元素,判断正确答案和用户答案是否相等,相等给10分//存分数的变量sumint sum = 0;for(int i =0;i<list.size();i++) {String zqda = list.get(i).getDa();String yhda = list.get(i).getUserda();if(zqda.equals(yhda)) {sum += 10;}}JOptionPane.showMessageDialog(null,"你的分数是:"+ sum);jb1.setEnabled(false);jb2.setEnabled(false);jb3.setEnabled(false);}});}//读取index题目的内容到面板public void getContent(int index) {//集合中每一个元素都是一道题,通过get方法获取第index道题,并且放到test对象中test = list.get(index);//把test中对于的成员变量的值在相应的组件中显示jlb.setText((index +1) +"、" + test.getContent());jr1.setText("A:" +test.getXx()[0]);jr2.setText("B:" +test.getXx()[1]);jr3.setText("C:" +test.getXx()[2]);jr4.setText("D:" +test.getXx()[3]);if(test.getUserda()!= null)switch(test.getUserda()) {case "A":jr1.setSelected(true);break;case "B":jr2.setSelected(true);break;case "C":jr3.setSelected(true);break;case "D":jr4.setSelected(true);break;}else {bg.clearSelection();}}//保存第index题的用户答案public void save(int index) {String userda;//根据用户选项对userda赋值,保存用户选择的内容if(jr1.isSelected()) {userda = "A";}else if (jr2.isSelected()) {userda = "B";}else if (jr3.isSelected()) {userda = "C";}else if (jr4.isSelected()) {userda = "D";}else  {userda = "E";}test.setUserda(userda);}public static void main(String args[]) {new ExamJFrame();}
}

于创建窗体对象并显示。

代码的整体结构可以分为以下几个部分:

  1. 导入相关的包和类:
package text;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.*;

  1. 定义ExamJFrame类,继承自JFrame类,并实现界面和功能:
public class ExamJFrame extends JFrame {// 成员变量声明// 构造方法// 初始化界面// 考试时的组件布局// 读取题目内容到面板// 保存当前题目的答案// 主方法
}

  1. 初始化界面:
public void init() {// 创建菜单栏和菜单项// 设置布局和添加面板
}

  1. 考试时的组件布局:
public void init2() {// 创建标签,单选按钮,按钮组和面板// 设置按钮和单选按钮的事件监听器
}

  1. 读取题目内容到面板:
public void getContent(int index) {// 根据题目索引获取对应的题目信息// 设置标签和单选按钮的内容
}

  1. 保存当前题目的答案:
public void save(int index) {// 根据用户选择的单选按钮保存答案
}

  1. 主方法:
public static void main(String args[]) {// 创建ExamJFrame对象
}

以上是代码的简要分块分析,每个部分负责不同的功能实现,最终构成了一个可以进行考试的GUI界面程序。

这是一个用于读取考试题目的Java类。该类包含一个静态方法read,接受一个文件路径参数,并返回一个包含题目信息的ArrayList<Test>集合。

read方法首先根据传入的文件路径创建一个File对象。然后创建一个FileReader对象和一个BufferedReader对象,用于读取文件内容。

接下来,通过循环逐行读取文件内容。每次读取一行信息后,根据该行内容创建一个Test对象,并将读取的信息存储在Test对象的相应成员变量中。

接着,读取四行选项内容,并将选项存储在一个字符串数组中。如果读取到的选项内容中包含"正确答案"标识,将正确答案标记存储到Test对象的da成员变量中,并去掉选项中的"正确答案"标识。

将四个选项存储在Test对象的xx成员变量中,然后将Test对象添加到ArrayList<Test>集合中。

最后,关闭BufferedReader和FileReader,并返回读取到的题目集合。

如果在读取文件过程中出现异常,将打印异常堆栈轨迹并返回null

package text;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;/*读取考试内容到集合中集合:ArrayList<Test> list1、确定文件位置2、创建读取文件的字符输入对象3、读取数据到集合4、释放资源*/
public class ExamRead {public static ArrayList<Test> read(String file){File f = new File(file);try {FileReader fr = new FileReader(f);//字符缓冲输入流,可以实现读取一行信息BufferedReader br = new BufferedReader(fr);//读取一行信息放到str中String str = br.readLine();//定义一个集合,存储每一道题ArrayList<Test> list = new ArrayList<Test>();//创建每一道题目的对象Test test;//如果str不为空或长度大于0while(str!=null && str.length()>0) {test = new Test();//将读取的信息放到content成员变量中,表示这道题的题目test.setContent(str);//输出读取的信息
//				System.out.println(str);//创建一个存储四个选项的数组String xx[] = new String[4];//读四行内容for(int i=0;i<4;i++) {//读取第i个选项str = br.readLine();//分析选项是否是正确答案,如果是,要对da赋值,并且去掉选项中的“(正确答案)”标识if(str.indexOf("正确答案")!=-1) {//循环变量i和选项ABCD之间是否有规律//i = 0   A(65 = 65+i)  i = 1   B(66=65+i)  i = 2  C(67 = 65+i)   i = 3   D(68)test.setDa(String.valueOf((char)(i+65)));//去掉正确选项中标识str = str.replace("(正确答案)", "");}//选项存入xx数组相应元素中xx[i]=str;}//把四个选项的数组赋值给teat对象的xx成员变量test.setXx(xx);//System.out.println(test);//把一道题添加到集合list中list.add(test);//接下来读取下一道题str = br.readLine();}br.close();fr.close();return list;}catch (FileNotFoundException e) {e.printStackTrace();}catch (IOException e) {e.printStackTrace();}return null;}
}

 

这段代码是一个用于读取考试内容并将其存储到集合中的静态方法。代码的分块分析如下:

  1. 导入所需的包和类:
package text;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

  1. 定义 ExamRead 类,并编写静态的 read 方法:
public class ExamRead {public static ArrayList<Test> read(String file){// 方法实现}
}

  1. 方法实现:
  • 创建一个 File 对象,用于表示待读取的文件。
  • 创建一个 FileReader 对象,并传入文件对象,用于读取文件内容。
  • 创建一个 BufferedReader 对象,用于按行读取文件内容。
  • 通过 readLine 方法从缓冲读取器中读取一行内容,存储到 str 字符串中。
  • 创建一个 ArrayList<Test> 对象,用于存储每道题的信息。
  • 创建一个 Test 对象,表示每道题。
  • 使用 setContent 方法将读取的题目信息存储到题对象的 content 成员变量中。
  • 创建一个字符串数组 xx,用于存储四个选项。
  • 使用循环读取四行内容,将选项存入 xx 数组相应位置。
  • 判断选项是否为正确答案,若是,则使用 setDa 方法将正确答案存入题对象的 da 成员变量,并去掉选项中的正确答案标识。
  • 将选项数组 xx 赋值给题对象的 xx 成员变量。
  • 将题对象添加到题目集合 list 中。
  • 继续读取下一道题,直到读取完毕。
  • 关闭缓冲读取器和文件读取器。
  • 返回题目集合 list
  1. 异常处理:
  • 当文件未找到时,打印异常堆栈信息。
  • 当读取文件发生异常时,打印异常堆栈信息。

总体来说,该方法通过逐行读取文件内容,并根据特定的格式解析题目、选项和答案。将每道题的信息存储在一个 Test 对象中,然后将所有题目对象存储在一个 ArrayList<Test> 集合中并返回。这样,调用该方法就可以将考试内容从文件中读取到内存中供后续使用。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/91345.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

光伏电站、变电站、等直流系统电参量测量仪器怎么选型

安科瑞虞佳豪 壹捌柒陆壹伍玖玖零玖叁 应用场景 工作拓扑图 功能 ①对电能参数进行采样计量和监测&#xff0c;逆变器或者能量管理系统&#xff08;EMS&#xff09;与之进行通讯&#xff0c;根据实时功率及累计电能实现防逆流、调节发电量、电池充放电等功能&#xff1b; ②…

一道经典面试题:@Configuration 和 @Component 有何区别?

文章目录 1. 情景展现2. 源码分析2.1 postProcessBeanDefinitionRegistry2.2 postProcessBeanFactory 关于 Configuration 注解有一个特别经典的面试题&#xff1a; Configuration 和 Component 有什么区别&#xff1f; 无论小伙伴们之前是否背过相关的面试题&#xff0c;今天…

比较opencv,pillow,matplotlib,skimage读取图像的速度比较

上面这些库都被广泛用于图像处理和计算机视觉任务&#xff1b; 不同的图像读取库&#xff08;OpenCV&#xff0c;Pillow&#xff0c;matplotlib和skimage&#xff09;的读取速度&#xff0c;是怎么样的一个情况&#xff1f; 下面分别从读取速度&#xff0c;以及转换到RGB通道…

【材料整理】-- Python、Matlab中常用调试代码,持续更新!

文章目录 Python、Matlab中常用调试代码&#xff0c;持续更新&#xff01;一、Python常用调试代码&#xff1a;二、Matlab常用调试代码&#xff1a; Python、Matlab中常用调试代码&#xff0c;持续更新&#xff01; 一、Python常用调试代码&#xff1a; 1、保存.mat文件 from…

41、springboot 整合 FreeMarker 模版技术

springboot 整合 FreeMarker 模版技术 ★ 整合FreeMarker的自动配置&#xff1a; FreeMarkerAutoConfiguration&#xff1a;负责整合Spring容器和获取FreeMarkerProperties加载的配置信息。FreeMarkerServletWebConfiguration/FreeMarkerReactiveWebConfiguration&#xff1a…

c# - - - 安装.net core sdk

如图&#xff0c;安装的是.Net Core 2.2版本 查看安装成功

【计算机网络】HTTPs 传输流程

HTTPS和HTTP的区别 1、HTTP协议传输的数据都是未加密的&#xff0c;是明文的&#xff0c;使用HTTP协议传输隐私信息非常不安 HTTPS协议是由SSLHTTP协议构建的可进行加密传输、身份认证的网络协议&#xff0c;要比http协议安全。 2、HTTPS协议需要到CA申请证书&#xff0c;一般…

NS2安装及入门实例——(ns2.35 / Ubuntu20.04)

文章目录 一、ns2安装1、更新系统源2、准备工作3、下载安装包4、安装5、问题① 问题1② 问题2③ 问题3 6、安装成功7、环境配置 二、nam安装1、安装2、问题 三、实例 一、ns2安装 1、更新系统源 sudo apt-get update sudo apt-get upgrade2、准备工作 sudo apt-get install …

Python Flask Web开发二:数据库创建和使用

前言 数据库在 Web 开发中起着至关重要的作用。它不仅提供了数据的持久化存储和管理功能&#xff0c;还支持数据的关联和连接&#xff0c;保证数据的一致性和安全性。通过合理地设计和使用数据库&#xff0c;开发人员可以构建强大、可靠的 Web 应用程序&#xff0c;满足用户的…

恒运资本:a股总市值怎么看?

跟着经济开展和金融商场的壮大&#xff0c;投资者越来越重视股市的行情。而对于A股商场来说&#xff0c;总市值是一个非常重要的目标。那么&#xff0c;A股总市值怎么看&#xff1f;以下是本文的详细剖析。 一、A股总市值界说与核算方法 首要需要了解A股总市值的界说和核算方法…

C++-list实现相关细节和问题

前言&#xff1a;C中的最后一个容器就是list&#xff0c;list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指…

Qt 解析XML文件 QXmlStreamReader

如何使用QXmlStreamReader来解析格式良好的XML&#xff0c;Qt的文档中指出&#xff0c;它是一种更快、更方便的Qt自己的SAX解析器&#xff08;QXmlSimpleReader&#xff09;的替代&#xff0c;它也较快&#xff0c;在某种情况下&#xff0c;比DOM&#xff08;QDomDocument&…