这是一个使用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();
}
}
于创建窗体对象并显示。
代码的整体结构可以分为以下几个部分:
- 导入相关的包和类:
package text;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.*;
- 定义ExamJFrame类,继承自JFrame类,并实现界面和功能:
public class ExamJFrame extends JFrame {
// 成员变量声明
// 构造方法
// 初始化界面
// 考试时的组件布局
// 读取题目内容到面板
// 保存当前题目的答案
// 主方法
}
- 初始化界面:
public void init() {
// 创建菜单栏和菜单项
// 设置布局和添加面板
}
- 考试时的组件布局:
public void init2() {
// 创建标签,单选按钮,按钮组和面板
// 设置按钮和单选按钮的事件监听器
}
- 读取题目内容到面板:
public void getContent(int index) {
// 根据题目索引获取对应的题目信息
// 设置标签和单选按钮的内容
}
- 保存当前题目的答案:
public void save(int index) {
// 根据用户选择的单选按钮保存答案
}
- 主方法:
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;
}
}
这段代码是一个用于读取考试内容并将其存储到集合中的静态方法。代码的分块分析如下:
- 导入所需的包和类:
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;
- 定义
ExamRead
类,并编写静态的read
方法:
public class ExamRead {
public static ArrayList<Test> read(String file){
// 方法实现
}
}
- 方法实现:
- 创建一个
File
对象,用于表示待读取的文件。 - 创建一个
FileReader
对象,并传入文件对象,用于读取文件内容。 - 创建一个
BufferedReader
对象,用于按行读取文件内容。 - 通过
readLine
方法从缓冲读取器中读取一行内容,存储到str
字符串中。 - 创建一个
ArrayList<Test>
对象,用于存储每道题的信息。 - 创建一个
Test
对象,表示每道题。 - 使用
setContent
方法将读取的题目信息存储到题对象的content
成员变量中。 - 创建一个字符串数组
xx
,用于存储四个选项。 - 使用循环读取四行内容,将选项存入
xx
数组相应位置。 - 判断选项是否为正确答案,若是,则使用
setDa
方法将正确答案存入题对象的da
成员变量,并去掉选项中的正确答案标识。 - 将选项数组
xx
赋值给题对象的xx
成员变量。 - 将题对象添加到题目集合
list
中。 - 继续读取下一道题,直到读取完毕。
- 关闭缓冲读取器和文件读取器。
- 返回题目集合
list
。
- 异常处理:
- 当文件未找到时,打印异常堆栈信息。
- 当读取文件发生异常时,打印异常堆栈信息。
总体来说,该方法通过逐行读取文件内容,并根据特定的格式解析题目、选项和答案。将每道题的信息存储在一个 Test
对象中,然后将所有题目对象存储在一个 ArrayList<Test>
集合中并返回。这样,调用该方法就可以将考试内容从文件中读取到内存中供后续使用。文章来源:https://www.toymoban.com/news/detail-673534.html
文章来源地址https://www.toymoban.com/news/detail-673534.html
到了这里,关于Java——一个使用Java Swing实现的考试系统的窗体类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!