一、项目介绍
本项目主要使用Java语言,利用JavaSwing实现可视化界面心理测试考试系统,包含完整的逻辑代码,数据文件,图片等等。本系统支持管理员与学生两个权限登录,没有账号的用户可以进行注册。
用户端会从题库中随机抽取20道题目进行测试,考试过程会记录时间,时间结束会强制交卷,用户阅读题目后可以在下方选项进行选择,提交试卷时如果没有选择,会被记为0分。用户可以点击上一页下一页切换题目,系统会记录你的答题状态,已经回答过的问题选项会被记录,并且可以修改。系统还会记录你已答数量,未答数量等。提交试卷后,会根据用户的选择进行打分,并显示出相应的评价,用户可以看到自己历史测试成绩。
管理员端可以管理题库中的试题,进行增加删除等,还可以管理系统中用户信息,授予考试权限。用户的所有测试结果都会显示在管理员端以查看用户的测试结果等,管理员不可以注册,登陆的账号密码已被固定。
二、效果预览
1.登录页面
2.考试页面
3.考试结果页面
4.试卷管理页面
5.学生管理页面
6.测评结果管理
三、主要代码演示
1.管理员页面
public class AdminFrame extends JFrame {
private static AdminFrame adminFrame;
private QuestionService service = MySpring.getBean("service.QuestionService");
private HashSet<Question> list;
//分割线
private ArrayList<JLabel> arr = new ArrayList<>();
protected AdminFrame() {
//创建试卷管理按钮
JButton man_qu = new JButton("试卷管理");
man_qu.setBounds(5, 50, 90, 30);
//创建学生管理按钮
JButton man_stu = new JButton("学生管理");
man_stu.setBounds(5, 150, 90, 30);
//创建测评结果管理按钮
JButton res_stu = new JButton("测评结果");
res_stu.setBounds(5, 250, 90, 30);
JTextField title = new JTextField("试题列表");
title.setBounds(330, 15, 135, 35);
title.setFont(new Font("黑体", Font.BOLD, 30));
// 创建编号与编号输入框
JLabel quest = new JLabel("问题:");
JTextField questionTextField = new JTextField();
quest.setBounds(100, 430, 50, 25);
questionTextField.setBounds(160, 430, 200, 25);
//选项A
JLabel aLable = new JLabel("选项A:");
JTextField aTextField = new JTextField();
aLable.setBounds(100, 460, 50, 25);
aTextField.setBounds(160, 460, 200, 25);
//选项B
JLabel bLable = new JLabel("选项B:");
JTextField bTextField = new JTextField();
bLable.setBounds(100, 490, 50, 25);
bTextField.setBounds(160, 490, 200, 25);
//选项C
JLabel cLable = new JLabel("选项C:");
JTextField cTextField = new JTextField();
cLable.setBounds(100, 520, 50, 25);
cTextField.setBounds(160, 520, 200, 25);
// 删除的问题序号
JLabel delnum = new JLabel("删除序号:");
JTextField delnumTextField = new JTextField();
delnum.setBounds(470, 460, 70, 25);
delnumTextField.setBounds(550, 460, 100, 25);
//创建增加按钮
JButton addQuestion = new JButton("添加试题");
addQuestion.setBounds(180, 560, 150, 30);
//创建删除按钮
JButton delQuestion = new JButton("删除试题");
delQuestion.setBounds(500, 560, 150, 30);
// 创建表格
JTable table = new JTable();
//设置表格
table.setModel(new DefaultTableModel(
new Object[][]{}, new String[]{"序号", "题目", "选项A", "选项B", "选项C"}
));
table.setRowHeight(16);
table.getColumnModel().getColumn(0).setPreferredWidth(40);
table.getColumnModel().getColumn(1).setPreferredWidth(360);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(100);
table.getColumnModel().getColumn(4).setPreferredWidth(100);
DefaultTableModel model = (DefaultTableModel) table.getModel();
list = QuestionFileReader.getQuestion();
//从文件查找数据放入表格中
if (!list.isEmpty()) {
int index = 1;
for (Question question : list) {
String[] str = question.getTitle().split(" ");
//去除掉选项前面的ABC以及换行符<br>
if (str[0].length() >= 4 && str[1].length() >= 4 && str[2].length() >= 4 && str[3].length() >= 2)
model.addRow(new Object[]{index++, str[0].substring(0, str[0].length() - 4), str[1].substring(2, str[1].length() - 4), str[2].substring(2, str[2].length() - 4), str[3].substring(2)});
}
}
// 创建table滚动窗体
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBounds(50, 60, 700, 350);
//创建监听器
addQuestion.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//获取输入的问题和选项
String question = questionTextField.getText();
String A = aTextField.getText();
String B = bTextField.getText();
String C = cTextField.getText();
String res = question + "<br> A." + A + "<br> B." + B + "<br> C." + C;
service.saveQuestion(res);
JOptionPane.showMessageDialog(AdminFrame.this, "保存成功");
Object[] data = new Object[]{list.size() + 1, question, A, B, C};
//将题添加到缓存
list.add(new Question(res));
//将新数据显示在表格中
model.addRow(data);
//增加后清空数据
questionTextField.setText("");
aTextField.setText("");
bTextField.setText("");
cTextField.setText("");
}
});
delQuestion.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int num = Integer.valueOf(delnumTextField.getText());
//删除序号对应的行的数据
for (int i = 0; i < model.getRowCount(); i++) {
int number = (Integer) model.getValueAt(i, 0);
if (num == number) {
model.removeRow(i);
}
if (i == model.getRowCount() - 1) {
JOptionPane.showMessageDialog(AdminFrame.this, "该序号不存在");
}
}
//增加后清空数据
delnumTextField.setText("");
}
});
JTextField title2 = new JTextField("学生列表");
title2.setBounds(330, 15, 135, 35);
title2.setFont(new Font("黑体", Font.BOLD, 30));
JLabel name = new JLabel("姓名:");
JTextField nameTextField = new JTextField();
name.setBounds(100, 430, 50, 25);
nameTextField.setBounds(160, 430, 200, 25);
JLabel num = new JLabel("学号:");
JTextField numTextField = new JTextField();
num.setBounds(100, 460, 50, 25);
numTextField.setBounds(160, 460, 200, 25);
JLabel major = new JLabel("专业:");
JTextField majorTextField = new JTextField();
major.setBounds(100, 490, 50, 25);
majorTextField.setBounds(160, 490, 200, 25);
JLabel class1 = new JLabel("班级:");
JTextField class1TextField = new JTextField();
class1.setBounds(100, 520, 50, 25);
class1TextField.setBounds(160, 520, 200, 25);
// 删除的问题序号
JLabel delnum1 = new JLabel("删除序号:");
JTextField delnumTextField1 = new JTextField();
delnum1.setBounds(470, 460, 70, 25);
delnumTextField1.setBounds(550, 460, 100, 25);
JTable table2 = new JTable();
//设置表格
table2.setModel(new DefaultTableModel(
new Object[][]{}, new String[]{"序号", "姓名", "学号", "专业", "班级"}
));
table2.setRowHeight(16);
DefaultTableModel model2 = (DefaultTableModel) table2.getModel();
ArrayList<String> arr1 = UserFileReader.getStu();
//从文件查找数据放入表格中
if (!arr1.isEmpty()) {
int index = 1;
for (String strs : arr1) {
String[] str = strs.split(" ");
model2.addRow(new Object[]{index++, str[0], str[1], str[2], str[3]});
}
}
// 创建学生table滚动窗体
JScrollPane scrollPane2 = new JScrollPane(table2);
scrollPane2.setBounds(50, 60, 700, 350);
//创建增加按钮
JButton addStu = new JButton("添加学生信息");
addStu.setBounds(180, 560, 150, 30);
//创建删除按钮
JButton delStu = new JButton("删除学生信息");
delStu.setBounds(500, 560, 150, 30);
addStu.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//获取输入的问题和选项
String name = nameTextField.getText();
String num = numTextField.getText();
String major = majorTextField.getText();
String class1 = class1TextField.getText();
UserFileReader.saveStu(name, num, major, class1);
Object[] data = new Object[]{arr1.size() + 1, name, num, major, class1};
JOptionPane.showMessageDialog(AdminFrame.this, "保存成功");
//将新数据显示在表格中
model2.addRow(data);
//增加后清空数据
questionTextField.setText("");
aTextField.setText("");
bTextField.setText("");
cTextField.setText("");
}
});
delStu.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int num = Integer.valueOf(delnumTextField1.getText());
//删除序号对应的行的数据
for (int i = 0; i < model2.getRowCount(); i++) {
int number = (Integer) model2.getValueAt(i, 0);
if (num == number) {
model2.removeRow(i);
JOptionPane.showMessageDialog(AdminFrame.this, "删除成功");
break;
}
if (i == model2.getRowCount() - 1) {
JOptionPane.showMessageDialog(AdminFrame.this, "该序号不存在");
}
}
//增加后清空数据
delnumTextField.setText("");
}
});
//心里测试结果
JTextField title3 = new JTextField("测评结果列表");
title3.setBounds(300, 15, 200, 35);
title3.setFont(new Font("黑体", Font.BOLD, 30));
JTable table3 = new JTable();
//设置表格
table3.setModel(new DefaultTableModel(
new Object[][]{}, new String[]{"序号", "姓名", "评分", "评价"}
));
table3.setRowHeight(16);
table3.getColumnModel().getColumn(0).setPreferredWidth(40);
table3.getColumnModel().getColumn(1).setPreferredWidth(70);
table3.getColumnModel().getColumn(2).setPreferredWidth(70);
table3.getColumnModel().getColumn(3).setPreferredWidth(520);
DefaultTableModel model3 = (DefaultTableModel) table3.getModel();
ArrayList<String> arr2 = QuestionFileReader.readResult();
//从文件查找数据放入表格中
if (!arr2.isEmpty()) {
int index = 1;
for (String strs : arr2) {
String[] str = strs.split(":");
String[] str2=str[2].split("。");
model3.addRow(new Object[]{index++, str[0], str2[0], str2[1]+str[3]});
}
}
// 创建测评结果table滚动窗体
JScrollPane scrollPane3 = new JScrollPane(table3);
scrollPane3.setBounds(50, 60, 700, 350);
JPanel container = new JPanel();//试卷管理内容页
JPanel buttons = new JPanel();//按钮页
JPanel stupanl = new JPanel();//学生内容页
JPanel resultpanl = new JPanel();//学生内容页
JPanel mainpanl = new JPanel();//总页面
buttons.add(man_qu);
buttons.add(man_stu);
buttons.add(res_stu);
stupanl.add(scrollPane2);
stupanl.add(title2);
stupanl.add(addStu);
stupanl.add(delStu);
stupanl.add(name);
stupanl.add(nameTextField);
stupanl.add(num);
stupanl.add(numTextField);
stupanl.add(major);
stupanl.add(majorTextField);
stupanl.add(class1);
stupanl.add(class1TextField);
stupanl.add(delnum1);
stupanl.add(delnumTextField1);
container.add(title);
container.add(scrollPane);
container.add(quest);
container.add(questionTextField);
container.add(aLable);
container.add(aTextField);
container.add(bLable);
container.add(bTextField);
container.add(addQuestion);
container.add(cTextField);
container.add(cLable);
container.add(delQuestion);
container.add(delnum);
container.add(delnumTextField);
resultpanl.add(scrollPane3);
resultpanl.add(title3);
//设置button区域的位置
buttons.setLayout(null);
buttons.setBounds(10, 10, 100, 600);
buttons.setBorder(BorderFactory.createLineBorder(Color.GRAY));
//内容区域位置
container.setLayout(null);
container.setBounds(120, 10, 780, 600);
container.setBorder(BorderFactory.createLineBorder(Color.GRAY));
//内容区域位置
stupanl.setLayout(null);
stupanl.setBounds(120, 10, 780, 600);
stupanl.setBorder(BorderFactory.createLineBorder(Color.GRAY));
//内容区域位置
resultpanl.setLayout(null);
resultpanl.setBounds(120, 10, 780, 600);
resultpanl.setBorder(BorderFactory.createLineBorder(Color.GRAY));
mainpanl.add(container);
mainpanl.add(buttons);
mainpanl.add(stupanl);
mainpanl.add(resultpanl);
stupanl.setVisible(false);
resultpanl.setVisible(false);
man_qu.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
container.setVisible(true);
stupanl.setVisible(false);
resultpanl.setVisible(false);
}
});
man_stu.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
container.setVisible(false);
stupanl.setVisible(true);
resultpanl.setVisible(false);
}
});
res_stu.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
container.setVisible(false);
stupanl.setVisible(false);
resultpanl.setVisible(true);
}
});
mainpanl.setLayout(null);
mainpanl.setBackground(Color.LIGHT_GRAY);
this.add(mainpanl);
this.setTitle("后台数据管理");
this.setVisible(true);
this.setSize(925, 658);
//this.setResizable(false);//不想让窗体拖拽大小
this.setLocationRelativeTo(null);// 设置居中显示
// 设置Jframe窗体关闭时 程序结束
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public synchronized static AdminFrame getAdminFrame() {
if (adminFrame == null) {
adminFrame = new AdminFrame();
}
return adminFrame;
}
}
2.考试页面
public class ExamFrame extends BaseFrame {
private static ExamFrame examFrame;
//当前登录的用户
private static String account;
private QuestionService service = MySpring.getBean("service.QuestionService");
//试卷
private ArrayList<Question> paper = service.getPaper(20);
//答题卡
private String[] answers = new String[paper.size() + 1];
private int totalCount = paper.size();//题目总数
private int unanswerCount = totalCount;//未答
//控制窗体右侧的数值显示
private int nowNumber = 0;//当前题号
private int answerCount = 0;//已答
//记录倒计时事件, 分钟为单位
private int time = 20;
//内部类 - 线程对象, 处理事件倒计时
private TimeControlThread timeControlThread = new TimeControlThread();
//添加三个panel 区域的分割
private JPanel mainPanel = new JPanel();//负责答题主页面展示
private JPanel messagePanel = new JPanel();//负责右侧信息展示
private JPanel buttonPanel = new JPanel();//负责下方按钮的展示
//添加主要答题的组件
private JTextArea examArea = new JTextArea();//考试文本域 展示题目
private JScrollPane scrollPane = new JScrollPane(examArea);//滚动条
//添加右侧信息的组件
private JLabel pictureLabel = new JLabel();//展示图片信息
private JLabel nowNumLabel = new JLabel("当前题号:");//提示当前的题号
private JLabel totalCountLabel = new JLabel("题目总数:");//提示题目的总数
private JLabel answerCountLabel = new JLabel("已答题数:");//提示已经答过的题目数量
private JLabel unanswerCountLabel = new JLabel("未答题数:");//提示未答题数量
private JTextField nowNumField = new JTextField();//展示题号
private JTextField totalCountField = new JTextField();//展示总数
private JTextField answerCountField = new JTextField();//展示已答数
private JTextField unanswerCountField = new JTextField();//展示未答数
private JLabel timeLabel = new JLabel("剩余答题时间");//提示剩余时间
private JLabel realTimeLabel = new JLabel();//倒计时真实时间
//添加下方按钮的组件
private JButton aButton = new JButton("A");//a按钮
private JButton bButton = new JButton("B");//b按钮
private JButton cButton = new JButton("C");//c按钮
private JButton prevButton = new JButton("上一题");//previous题
private JButton nextButton = new JButton("下一题");//next题
private JButton submitButton = new JButton("提交试卷");//提交按钮
private ExamFrame() {
super("考试窗口");
this.init();
}
public synchronized static ExamFrame getExamFrame(String user) {
if (examFrame == null) {
examFrame = new ExamFrame();
}
account = user;
return examFrame;
}
@Override
protected void setFontAndSoOn() {
//设置panel布局管理---->自定义
mainPanel.setLayout(null);
mainPanel.setBackground(Color.LIGHT_GRAY);
//设置message区域的位置
messagePanel.setLayout(null);
messagePanel.setBounds(680, 10, 300, 550);
messagePanel.setBorder(BorderFactory.createLineBorder(Color.GRAY));
//设置button区域的位置
buttonPanel.setLayout(null);
buttonPanel.setBounds(16, 470, 650, 90);
buttonPanel.setBorder(BorderFactory.createLineBorder(Color.GRAY));
//手动设置每一个组件的位置 字体 背景
scrollPane.setBounds(16, 10, 650, 450);
examArea.setFont(new Font("黑体", Font.BOLD, 20));
examArea.setEnabled(false);//文本域中的文字不能编辑
this.showQuestion();//展示第一道题
pictureLabel.setBounds(10, 10, 280, 230);
pictureLabel.setBorder(BorderFactory.createLineBorder(Color.GRAY));
//pictureLabel.setIcon(null);//展示图片信息
nowNumLabel.setBounds(40, 270, 100, 30);
nowNumLabel.setFont(new Font("黑体", Font.PLAIN, 20));
nowNumField.setBounds(150, 270, 100, 30);
nowNumField.setFont(new Font("黑体", Font.BOLD, 20));
nowNumField.setBorder(BorderFactory.createLineBorder(Color.GRAY));
nowNumField.setEnabled(false);
nowNumField.setHorizontalAlignment(JTextField.CENTER);
totalCountLabel.setBounds(40, 310, 100, 30);
totalCountLabel.setFont(new Font("黑体", Font.PLAIN, 20));
totalCountField.setBounds(150, 310, 100, 30);
totalCountField.setFont(new Font("黑体", Font.BOLD, 20));
totalCountField.setBorder(BorderFactory.createLineBorder(Color.GRAY));
totalCountField.setEnabled(false);
totalCountField.setHorizontalAlignment(JTextField.CENTER);
answerCountLabel.setBounds(40, 350, 100, 30);
answerCountLabel.setFont(new Font("黑体", Font.PLAIN, 20));
answerCountField.setBounds(150, 350, 100, 30);
answerCountField.setFont(new Font("黑体", Font.BOLD, 20));
answerCountField.setBorder(BorderFactory.createLineBorder(Color.GRAY));
answerCountField.setEnabled(false);
answerCountField.setHorizontalAlignment(JTextField.CENTER);
unanswerCountLabel.setBounds(40, 390, 100, 30);
unanswerCountLabel.setFont(new Font("黑体", Font.PLAIN, 20));
unanswerCountField.setBounds(150, 390, 100, 30);
unanswerCountField.setFont(new Font("黑体", Font.BOLD, 20));
unanswerCountField.setBorder(BorderFactory.createLineBorder(Color.GRAY));
unanswerCountField.setEnabled(false);
unanswerCountField.setHorizontalAlignment(JTextField.CENTER);
timeLabel.setBounds(90, 460, 150, 30);
timeLabel.setFont(new Font("黑体", Font.PLAIN, 20));
timeLabel.setForeground(Color.BLUE);
realTimeLabel.setBounds(108, 490, 150, 30);
realTimeLabel.setFont(new Font("黑体", Font.BOLD, 20));
realTimeLabel.setForeground(Color.BLUE);
aButton.setBounds(110, 10, 120, 30);
aButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
bButton.setBounds(260, 10, 120, 30);
bButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
cButton.setBounds(410, 10, 120, 30);
cButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
prevButton.setBounds(60, 50, 100, 30);
prevButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
nextButton.setBounds(490, 50, 100, 30);
nextButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
submitButton.setBounds(276, 50, 100, 30);
submitButton.setForeground(Color.RED);
submitButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
//设置控制窗体右侧的数值
nowNumField.setText(nowNumber + 1 + "");
totalCountField.setText(totalCount + "");
answerCountField.setText(answerCount + "");
unanswerCountField.setText(unanswerCount + "");
}
@Override
protected void addElement() {
messagePanel.add(pictureLabel);
messagePanel.add(nowNumLabel);
messagePanel.add(nowNumField);
messagePanel.add(totalCountLabel);
messagePanel.add(totalCountField);
messagePanel.add(answerCountLabel);
messagePanel.add(answerCountField);
messagePanel.add(unanswerCountLabel);
messagePanel.add(unanswerCountField);
messagePanel.add(timeLabel);
messagePanel.add(realTimeLabel);
buttonPanel.add(aButton);
buttonPanel.add(bButton);
buttonPanel.add(cButton);
buttonPanel.add(prevButton);
buttonPanel.add(nextButton);
buttonPanel.add(submitButton);
mainPanel.add(scrollPane);
mainPanel.add(messagePanel);
mainPanel.add(buttonPanel);
this.add(mainPanel);
}
@Override
protected void addListener() {
//4个选项按钮
ActionListener option = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//清楚全部选项按钮的颜色
ExamFrame.this.clearOptionButtonColor();
//处理点击的按钮
JButton button = (JButton) e.getSource();
button.setBackground(Color.GREEN);
//填写答题卡
answers[nowNumber] = button.getText();
}
};
aButton.addActionListener(option);
bButton.addActionListener(option);
cButton.addActionListener(option);
//next按钮
nextButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (nowNumber == 0) {
prevButton.setEnabled(true);
}
//清楚全部选项按钮的颜色
ExamFrame.this.clearOptionButtonColor();
//题号增加
nowNumber++;
//主界面与按钮界面变化
if (nowNumber == totalCount) {//答完
examArea.setText("全部题目已经回答完毕\n请点击下方提交按钮");
//next按钮失效
nextButton.setEnabled(false);
//全部选项按钮失效
ExamFrame.this.setOptionButtonEnabled(false);
} else {
ExamFrame.this.showQuestion();
//修改右侧题号
ExamFrame.this.nowNumField.setText(nowNumber + 1 + "");
}
//修改已答题 未答题
ExamFrame.this.answerCountField.setText(++answerCount + "");
ExamFrame.this.unanswerCountField.setText(--unanswerCount + "");
//还原之前的选择
ExamFrame.this.restoreButton();
}
});
//prev按钮
prevButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (nowNumber == totalCount) {
ExamFrame.this.setOptionButtonEnabled(true);
nextButton.setEnabled(true);
}
//清除全部选项按钮的颜色
ExamFrame.this.clearOptionButtonColor();
//题号减少
nowNumber--;
//按钮界面变化
if (nowNumber == 0) {
prevButton.setEnabled(false);
}
//显示题目
ExamFrame.this.showQuestion();
//修改右侧题号 已答题 未答题
nowNumField.setText(nowNumber + 1 + "");
answerCountField.setText(--answerCount + "");
unanswerCountField.setText(++unanswerCount + "");
//还原之前的选择
ExamFrame.this.restoreButton();
}
});
//submit按钮
submitButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//0.显示确认框
//是0 否1 取消2
int value = JOptionPane.showConfirmDialog(ExamFrame.this, "确认提交?");
if (value == 0) {
//1.倒计时停止
timeControlThread.stopTimeThread();
//2.所有按钮失效
setOptionButtonEnabled(false);
nextButton.setEnabled(false);
prevButton.setEnabled(false);
//3.选项按钮颜色清楚
clearOptionButtonColor();
//4.最终成绩的计算,并展示
float score = gradePaper();
StringBuffer sb1 = new StringBuffer();
String result = "";
if (score >= 61 && score <= 75) {
result = "你本次测试的最终得分是: " + score + "。\n" +
"儿童,儿童心理年龄的关键词是:幼稚。" + "\n" +
"你的心理年龄只有10岁左右,你对这个世界还充满了好奇心,一切在你看来" + "\n" +
"都是新鲜和有趣的。你对外界的反应很直接,对情绪的控制能力很差。如果" + "\n" +
"说你的生理年龄超过了心理年龄,那么你会很难适应周围的环境。";
} else if (score >= 51 && score <= 60) {
result = "你本次测试的最终得分是: " + score + "。\n" +
"年轻人,年轻人心理年龄的关键词是:冲突。" + "\n" +
"你的心理年龄在20~30岁,你已经有了自己的想法,也能控制一部分情绪和承担一定的" + "\n" +
"责任。当你的理想化和现实发生冲突的时候,你会感到很痛苦,正在不断地摸索解决的" + "\n" +
"办法。如果说你的生理年龄与你的心理年龄产生超 过10岁以上的差异,那么你的适应" + "\n" +
"能力有待调节。";
} else if (score >= 36 && score <= 50) {
result = "你本次测试的最终得分是: " + score + "。\n" +
"中年人,中年人心理年龄的关键词是:成熟。" + "\n" +
"你的心理年龄在35~50岁,你完全知道怎么处理各种矛盾,你也知道自己的问题出在哪" + "\n" +
"里,你有了丰富的社会经验和与人打交道的能力。对于生活中的大部分问题,你已经" + "\n" +
"有了解决的办法。如果说你的生理年龄与你的心理 年龄相差无几,那么你的适应能力" + "\n" +
"已经很好。";
} else {
result = "你本次测试的最终得分是: " + score + "。\n" +
"老人,老年人心理年龄的关键词是:固执。" + "\n" +
"你的心理年龄在50~70岁,你认为自己已经完全了解整个社会的所有问题,你形" + "\n" +
"成了自己的处世风格。遇到问题,你坚信只有你知道唯一的 正确答案。内心深处" + "\n" +
"已经逐渐拒绝接受改变。如果说你的生理年龄比你的心理年龄小,那么 你需要的" + "\n" +
"是打破固有的约束,跟上社会的步伐继续前进。";
}
sb1.append(result);
sb1.append("\n\n您以前的测试结果为:\n");
ArrayList<String> strings = QuestionFileReader.readResult(account);
for (String str : strings) {
sb1.append(str + "\n");
}
examArea.setText(sb1.toString());
//输出文件时去掉换行
String[] strs = result.split("\n");
StringBuffer sb = new StringBuffer();
for (String str : strs) {
sb.append(str);
}
service.saveResult(account + ":" + sb.toString());
}
}
});
}
@Override
protected void setFrameSelf() {
this.setBounds(260, 130, 1000, 600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);//不想让窗体拖拽大小
this.setVisible(true);//最终展示整个窗体
timeControlThread.start();//启动线程, 倒计时开始
}
//展示一道题目
private void showQuestion() {
Question question = paper.get(nowNumber);
//展示图片
pictureLabel.setIcon(this.drawPicture("src\\img\\" + "exam.jpg"));
examArea.setText((nowNumber + 1) + "." + question.getTitle().replace("<br>", "\n "));
}
//画图
private ImageIcon drawPicture(String path) {
ImageIcon imageIcon = new ImageIcon(path);
imageIcon.setImage(imageIcon.getImage().getScaledInstance(280, 230, Image.SCALE_DEFAULT));
return imageIcon;
}
//下一题时清除全部选项按钮的颜色
private void clearOptionButtonColor() {
aButton.setBackground(null);
bButton.setBackground(null);
cButton.setBackground(null);
}
//控制全部选项按钮是否可用
private void setOptionButtonEnabled(boolean key) {
aButton.setEnabled(key);
bButton.setEnabled(key);
cButton.setEnabled(key);
}
//还原上一题的选项
private void restoreButton() {
String answer = answers[nowNumber];
if (answer == null) {
return;
}
switch (answer) {
case "A":
aButton.setBackground(Color.GREEN);
break;
case "B":
bButton.setBackground(Color.GREEN);
break;
case "C":
cButton.setBackground(Color.GREEN);
break;
}
}
//计算最终成绩
private float gradePaper() {
float score = 0;
for (int i = 0; i < paper.size(); i++) {
if ("A".equals(answers[i])) {
score += 3;
} else if ("B".equals(answers[i])) {
score += 2;
} else if ("C".equals(answers[i])) {
score += 1;
} else {
score += 0;
}
}
return score;
}
//用来处理倒计时问题
private class TimeControlThread extends Thread {
private boolean flag = true;//此时正常执行线程处理
public void stopTimeThread() {
this.flag = false;
}
@Override
public void run() {
//time转化为 小时:分钟:秒
int hour = time / 60;
int minute = time % 60;
int second = 0;
while (flag) {
//处理时分秒的显示
StringBuilder builder = new StringBuilder();
if (hour >= 0 && hour < 10) {
builder.append("0");
}
builder.append(hour);
builder.append(":");
if (minute >= 0 && minute < 10) {
builder.append("0");
}
builder.append(minute);
builder.append(":");
if (second >= 0 && second < 10) {
builder.append("0");
}
builder.append(second);
//展示
realTimeLabel.setText(builder.toString());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//改变时间
if (second > 0) {
second--;
} else {
if (minute > 0) {
second = 59;
minute--;
} else {
if (hour > 0) {
second = 59;
minute = 59;
hour--;
} else {
//考试结束
realTimeLabel.setForeground(Color.RED);
setOptionButtonEnabled(false);
nextButton.setEnabled(false);
prevButton.setEnabled(false);
JOptionPane.showMessageDialog(ExamFrame.this, "考试结束了");
break;
}
}
}
}
}
}
}
3.登录页面
public class LoginFrame extends BaseFrame {
private LoginFrame(){
super("登录窗口");
this.init();
}
private static LoginFrame loginFrame;
public synchronized static LoginFrame getLoginFrame(){
if (loginFrame == null){
loginFrame = new LoginFrame();
}
return loginFrame;
}
private UserService service = MySpring.getBean("service.UserService");
//创建一个面板
private JPanel mainPanel = new JPanel();
//创建title显示标题
private JLabel titleLabel = new JLabel("心 理 测 试 系 统");
//创建账号和密码的标题
private JLabel accountLabel = new JLabel("账 户:");
private JLabel passwordLabel = new JLabel("密 码:");
private JLabel labDo = new JLabel("权 限:");
private String[] labs = {"管理员","用户"};
private JComboBox labCombo = new JComboBox(labs);
//创建输入账号和密码的文本框/密码框
private JTextField accountField = new JTextField();
private JPasswordField passwordField = new JPasswordField();
//创建两个按钮
private JButton loginButton = new JButton("登 录");
private JButton registerButton = new JButton("注 册");
//设置每一个组件的位置 大小 字体 布局等等
protected void setFontAndSoOn(){
//设置组件的位置----布局管理
//设置panel的布局管理为自定义方式
mainPanel.setLayout(null);
//设置标题组件的位置和字体大小
titleLabel.setBounds(120,40,340,35);
titleLabel.setFont(new Font("黑体",Font.BOLD,34));
//设置用户名label位置和字体大小
accountLabel.setBounds(94,124,90,30);
accountLabel.setFont(new Font("黑体",Font.BOLD,24));
//设置用户名filed位置和字体大小
accountField.setBounds(204,124,260,30);
accountField.setFont(new Font("黑体",Font.BOLD,24));
//设置密码label位置和字体大小
passwordLabel.setBounds(94,174,90,30);
passwordLabel.setFont(new Font("黑体",Font.BOLD,24));
//设置密码field位置和字体大小
passwordField.setBounds(204,174,260,30);
passwordField.setFont(new Font("黑体",Font.BOLD,24));
labDo.setBounds(94,214,90,30);
labDo.setFont(new Font("黑体",Font.BOLD,24));
labCombo.setBounds(204,214,120,30);
//设置登录按钮的位置和文字大小
loginButton.setBounds(154,292,100,30);
loginButton.setFont(new Font("黑体",Font.BOLD,22));
//设置退出按钮的位置和文字大小
registerButton.setBounds(304,292,100,30);
registerButton.setFont(new Font("黑体",Font.BOLD,22));
}
//将所有的组件添加在窗体上
protected void addElement(){
//将所有的组件添加至窗体上
mainPanel.add(titleLabel);
mainPanel.add(accountLabel);
mainPanel.add(accountField);
mainPanel.add(passwordLabel);
mainPanel.add(passwordField);
mainPanel.add(loginButton);
mainPanel.add(registerButton);
mainPanel.add(labCombo);
mainPanel.add(labDo);
this.add(mainPanel);
}
//绑定事件监听
protected void addListener(){
loginButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//1.获取用户输入的账号和密码
// 从登录窗口上的组件内获取 文本框 密码框
String account = accountField.getText();
String password = new String(passwordField.getPassword());
String power= (String) labCombo.getSelectedItem();
if(power.equals("管理员")){
if(account.equals("admin")&&password.equals("admin")){
LoginFrame.this.setVisible(false);//将登录窗口隐藏
AdminFrame.getAdminFrame();
}else{
//弹出一个警告框 告诉登录失败啦
JOptionPane.showMessageDialog(LoginFrame.this,"用户名或密码错误");
//设置文本框和密码框的值为空
accountField.setText("");
passwordField.setText("");
}
}else{
String result = service.login(account,password);
if (result.equals("登录成功")){//用户登录成功
LoginFrame.this.setVisible(false);//将登录窗口隐藏
ExamFrame.getExamFrame(account);
}else{
//弹出一个警告框 告诉登录失败啦
JOptionPane.showMessageDialog(LoginFrame.this,result);
//设置文本框和密码框的值为空
accountField.setText("");
passwordField.setText("");
}
}
}
});
registerButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
LoginFrame.this.setVisible(false);//将登录窗口隐藏
RegisterFrame.getRegisterFrame();
}
});
}
protected void setFrameSelf(){
//设置窗体起始位置和大小
this.setBounds(600,280,560,400);
//设置点击关闭退出程序
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗体大小不可拖拽
this.setResizable(false);
//设置窗体显示状态
this.setVisible(true);
}
}
以上就是主要部分的内容展示,要获取完整代码,可以去我的git上面直接下载哦!喜欢的话点点赞!感谢您的支持!
->心理测试考试系统完整代码