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

news2024/11/19 8:28:32

这是一个使用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);
		//滚动条面板添加jlb
		jp1.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分
				//存分数的变量sum
				int 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> list
 1、确定文件位置
 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不为空或长度大于0
			while(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.coloradmin.cn/o/927997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

30天涨粉50万+ ,知识区诞生黑马UP主

飞瓜数据&#xff08;B站版&#xff09;数据显示&#xff0c;UP主你的同桌狗兄在近30天内&#xff0c;涨粉数累积达到53.4万&#xff0c;多次登上飞瓜数据&#xff08;B站版&#xff09;【涨粉榜】。 从粉丝变化趋势图可以看到&#xff0c;涨粉高峰期就是在8月。其实UP主并不是…

NSSCTF——Web题目2

目录 一、[HNCTF 2022 Week1]2048 二、[HNCTF 2022 Week1]What is Web 三、[LitCTF 2023]1zjs 四、[NCTF 2018]签到题 五、[SWPUCTF 2021 新生赛]gift_F12 一、[HNCTF 2022 Week1]2048 知识点&#xff1a;源代码审计 解题思路&#xff1a; 1、打开控制台&#xff0c;查看…

【Python】通过现象和本质理解python赋值、浅拷贝、深拷贝

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、看问题本质1.认识赋值、浅拷贝、深拷贝 二.看问题现象1.改变1级数据&#xff0c;这里要改变d2.改变2级数据&#xff0c;这里改变a或者…

c++学习【20】slam中的PnP问题

考虑n个三维空间点和它们的投影和&#xff0c; 第二个相机相对于第一个相机转换 现在已知和,求第二个相机相对于第一个相机转换 , 下面随机初始化一个,由可以推导出&#xff0c;但是有误差。 : public 表示 CurveFittingVertex 类从 g2o::BaseVertex<3, Eigen::Vector3d&…

知识速递(六)|ChIP-seq分析要点集锦

书接上文组学知识速递&#xff08;五&#xff09;|ChIP-seq知多少&#xff1f;&#xff0c;当我们实验完成&#xff0c;拿到下机数据之后&#xff0c;我们最关心的就是&#xff0c;这个数据能不能用&#xff1f;所谓数据能不能用&#xff0c;其实我们会重点关注以下问题&#x…

预防缓存穿透工具类

1. 前言 缓存穿透大家都知道&#xff0c;这里简单过一下 缓存和数据库中都没有的数据&#xff0c;而用户不断发起请求。比如查询id -1 的值 想着很多面向C端的查询接口&#xff0c;可能都需要做一下缓存操作&#xff0c;这里简单写了个自定义注解&#xff0c;将查询结果(包含…

黄金现货价格强弱怎么看?

相对强弱指标RSI由韦尔斯.怀尔德(Welles Wilder)提出&#xff0c;最初被用于期货交易之中&#xff0c;后来人们发现该指标用在现货黄金市场上的效果也十分不错&#xff0c;并对它的特点不断进行归纳和总结&#xff0c;如今已经成为市场上被应用得最为广泛的技术指标之一。 我们…

【C++】GCC对应C++的版本支持

1、查看当前GCC的版本 pffNUC12WSKi7:~$ gcc -v Using built-in specs. COLLECT_GCCgcc COLLECT_LTO_WRAPPER/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper OFFLOAD_TARGET_NAMESnvptx-none:hsa OFFLOAD_TARGET_DEFAULT1 Target: x86_64-linux-gnu Configured with: ../src/co…

高忆管理股市资讯:保持合理息差水平 新一轮存款利率下调可期

1年期借款商场报价利率(LPR)日前再度下调&#xff0c;意味着实体经济融资本钱将随之下行。业内人士以为&#xff0c;当时商业银行负债端本钱仍显刚性&#xff0c;净息差已降至近年来低位&#xff0c;为保持合理息差水平&#xff0c;商业银行存款挂牌利率或许迎来新一轮下调。 上…

实训笔记8.25

实训笔记8.25 8.25笔记一、Flume数据采集技术1.1 Flume实现数据采集主要借助Flume的组成架构1.2 Flume采集数据的时候&#xff0c;核心是编写Flume的采集脚本xxx.conf1.2.1 脚本文件主要由五部分组成 二、Flume案例实操2.1 采集一个网络端口的数据到控制台2.1.1 分析案例的组件…

NFT Insider #104:The Sandbox:全新土地销售活动 Turkishverse 来袭

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members、BeepCrypto联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟世界类&#…

校园供水系统智能管理

import pandas as pd data1pd.read_excel("C://Users//JJH//Desktop//E//附件_一季度.xlsx") data2pd.read_excel("C://Users//JJH//Desktop//E//附件_二季度.xlsx") data3pd.read_excel("C://Users//JJH//Desktop//E//附件_三季度.xlsx") data4…

Unity3D Pico VR 手势识别 二

Unity3D Pico VR 手势识别_Cool-浩的博客-CSDN博客 此篇主要讲解怎么手势追踪&#xff0c;手势姿态自定义预制识别&#xff0c;不会导入SDK和配置环境的请看上一章节 环境要求 SDK 版本&#xff1a;2.3.0 及以上PICO 设备型号&#xff1a;PICO Neo3 和 PICO 4 系列PICO 设备系…

Elasticsearch 集成---Spark Streaming 框架集成

一.Spark Streaming 框架介绍 Spark Streaming 是 Spark core API 的扩展&#xff0c;支持实时数据流的处理&#xff0c;并且具有可扩展&#xff0c; 高吞吐量&#xff0c;容错的特点。 数据可以从许多来源获取&#xff0c;如 Kafka &#xff0c; Flume &#xff0c; Kin…

网络地址转换NAT-动态NAT的使用范围和配置-思科EI,华为数通

网络地址转换NAT-动态NAT的使用范围和配置 什么是动态NAT&#xff1f; 使用公有地址池&#xff0c;并以先到先得的原则分配这些地址。当具有私有 IP 地址的主机请求访问 Internet 时&#xff0c;动态 NAT 从地址池中选择一个未被其它主机占用的 IP 地址一对一的转化。当数据会话…

操作无法完成错误0x0000709的解决方法分享,教你快速修复错误代码问题

在使用计算机时&#xff0c;我们有时会遇到各种错误代码。其中之一是错误代码0x0000709&#xff0c;表示操作无法完成。这个错误代码可能由多种原因引起&#xff0c;但幸运的是&#xff0c;我们可以采取一些措施来解决它。本文将介绍错误代码0x0000709的含义&#xff0c;提供几…

使用vlc在线播放rtsp视频url

1. 2. 3. 工具链接&#xff1a; https://download.csdn.net/download/qq_43560721/88249440

人效九宫格城市沙龙暨《人效九宫格白皮书》发布会 —上海站,圆满结束

8月11日&#xff0c;在上海龙之梦万丽酒店&#xff0c;由盖雅工场主办的人效九宫格城市沙龙暨《人效九宫格白皮书》发布会 —上海站&#xff0c;圆满结束。 近百位来自多个行业的企业管理者及人力资源从业者汇聚一堂&#xff0c;共同探讨企业如何将盈利模式从数量增长转为质量增…

生成式 AI 在 Gartner 的 2023 年炒作周期中备受关注

原创 | 文 BFT机器人 01 背景 Gartner&#xff0c; Inc. 在其最新的 2023 年新兴技术炒作周期中&#xff0c;将生成人工智能(AI)定位于膨胀期望的顶峰&#xff0c;预计它将在未来两到五年内带来转型效益。这种人工智能变体是更广泛的新兴人工智能趋势的一部分&#xff0c;预示…

挂耳式运动耳机哪个款式戴着跑步舒服、挂耳式运动耳机推荐

对于和我一样热爱健身和运动的人来说&#xff0c;音乐就像一种调动情绪的"兴奋剂"&#xff0c;在戴上耳机、聆听着动感的音乐时&#xff0c;我们能够感受到肌肉的收缩&#xff0c;完全沉浸在自己的世界中。这种状态让我们的训练状态达到巅峰&#xff0c;快乐倍增。因…