Рис.3.4.1. Алгоритм тестирования
Исходный код класса:
package KursPackage;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.border.TitledBorder;
public class KTestWin extends JDialog/*JFrame*/{
KTestWin g;
int numall;//всего вопросов
int numtrue;//к-во правильных ответов на данной странице
int num;//к-во правильных ответов студента
int time;//время на выполнение теста
int numproi;
Date date;
JLabel lttend;//время до окончания теста
JLabel lrans;//к-во прав. ответов студента
JLabel question;
JButton bnext;
JButton bstop;
JCheckBox cb[] = new JCheckBox[4];
boolean ans[] = new boolean [4];//правильные ответы
JPanel panel;
long megotime;
TitledBorder tv; KTestWin (final String login, String password, KMainWin d) throws FileNotFoundException, IOException{
super(d, "Тест", true);
g = this;
setLayout(new FlowLayout ());
date = new Date();
//узнаем время данное на выполнение теста
BufferedReader tt = new BufferedReader(new
FileReader(Consts.curtesttime));
time = Integer.parseInt(tt.readLine());
tt.close();
//узнали
megotime = date.getTime() + time;
panel = new JPanel ();
panel.setLayout(new FlowLayout ());
//узнаем кво вопросов
BufferedReader test = new BufferedReader(new
FileReader(Consts.curtest));
if (test.ready())
{
while (test.ready()){
if (test.readLine().equals("<q>"))
numall++;
}
}
else {
JOptionPane.showMessageDialog(null, "Не найден файл \" " + Consts.curtest + " \"");
dispose();
}
test.close();
//узнали
//------------------------------init------------------------------------
numproi = 1;
num = 0;
tv = new TitledBorder ("Вопрос");
lrans = new JLabel ("Количество правильных ответов: 0");
lttend = new JLabel ("Время осталось: " + String.valueOf((megotime - date.getTime())/1000) + " sec");
question = new JLabel();
bnext = new JButton ("Далее");
bstop = new JButton ("Стоп");
final BufferedReader tst = new BufferedReader(new
FileReader(Consts.curtest));
add(lttend);
add(lrans);
panel.setLayout(new BoxLayout (panel, BoxLayout.Y_AXIS));
panel.setPreferredSize(new Dimension (580, 180));
tst.readLine();
question.setText(tst.readLine());
panel.add(question);
for (int i = 0; i<4 ; i++){
cb[i] = new JCheckBox (tst.readLine(), false);
ans[i] = Boolean.parseBoolean(tst.readLine());
panel.add(cb[i]);
}
if (numproi == numall)
{
bnext.hide();
}
if (((megotime - date.getTime())/1000)<0){
bnext.hide();
}
bnext.addActionListener(new ActionListener () {
public void actionPerformed(ActionEvent e) {
numtrue = 0;
for (int i = 0; i < 4; i++){
if (cb[i].isSelected() == ans[i]){
numtrue++;
}
}
if (numtrue == 4){
num++;
}
numproi++;
lrans.setText("Количество правильных ответов: " + num);
lttend.setText("Время осталось: " + String.valueOf((megotime - new Date().getTime())/1000) + " sec");
if (numproi == numall)
{
bnext.hide();
}
try {
tst.readLine();
question.setText(tst.readLine());
for (int i = 0; i<4 ; i++){
cb[i].setLabel(tst.readLine());
cb[i].setSelected(false);
ans[i] = Boolean.parseBoolean(tst.readLine());
}
} catch (IOException ex) {
Logger.getLogger(KTestWin.class.getName()).log(Level.SEVERE, null, ex);
}
if (((megotime - date.getTime())/1000)<0){
bnext.hide();
}
}
});
final ActionListener listener = new ActionListener (){
public void actionPerformed(ActionEvent e) {
numtrue = 0;
for (int i = 0; i < 4; i++){
if (cb[i].isSelected() == ans[i]){
numtrue++;
}
}
if (numtrue == 4){
num++;
}
bstop.hide();
JButton close = new JButton ("Close");
numproi++;
tv.setTitle("Статистика");
lrans.hide();
lttend.hide();
bnext.hide();
question.setText("Количество правильных ответов: " + num);
panel.add(new JLabel("Запись результатов в файл..."));
try{
String buf[] = new String [3];
BufferedWriter mrk = new BufferedWriter(new FileWriter(Consts.pprofiles + login + ".mrk"));
mrk.write(num + "/" + numall);
mrk.close();
BufferedWriter marks = new BufferedWriter(new FileWriter(Consts.marks));
BufferedReader prof = new BufferedReader (new FileReader (Consts.pprofiles + login));
buf[0] = prof.readLine();
buf[1] = prof.readLine();
prof.readLine();
prof.readLine();
buf[2] = prof.readLine();
marks.write(buf[0] + " " + buf[1] + " " + buf[2] + " has " + num + "/" + numall + "\n");
prof.close();
marks.close();
}catch(Exception ey){
System.out.print(ey);
}
panel.add(new JLabel("Запись успешно завершена"));
for (int i = 0; i<4 ; i++)
cb[i].hide();
try {
tst.close();
} catch (IOException ex) {
Logger.getLogger(KTestWin.class.getName()).log(Level.SEVERE, null, ex);
}
close.addActionListener(new ActionListener (){
public void actionPerformed(ActionEvent e) {
dispose();
}
});
g.setSize (600, 255);
add(close);
g.repaint();
}
};
Timer timer = new Timer(time, listener);
timer.setRepeats(false);
timer.start();
bstop.addActionListener(listener);
panel.setBorder(tv);
add(panel);
add(new JLabel ("Всего вопросов : " + numall));
add(bnext);
add(bstop);
setSize (600, 280);
setVisible(true);
}
}
Рис.3.4.2. Начало теста
Рис3.4.3. Окончание теста:
5. Класс подготовки пользователя
Задача класса – подготовка пользователя к тестированию.
Рис. 3.5.1. Алгоритм записи времени чтения
Исходный код класса:
package KursPackage;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
public class KLec extends JFrame {
JEditorPane je;
JScrollPane js;
long time;
long curtime;
KLec (String lec, String title, boolean iseditable, final String login) throws IOException{
super (title);
je = new JEditorPane ("text/html;Content-Type = windows-1251", "<html><i><center>Подготовка к тестам</center>");
js = new JScrollPane (je);
je.setEditable(iseditable);
if (title.equals("Подготовка к тестам")){
BufferedReader tt = new BufferedReader(new FileReader(Consts.pprofiles + login + ".tme"));
time = Long.parseLong(tt.readLine());
curtime = new Date().getTime();
tt.close();
}
BufferedReader rd = new BufferedReader(new FileReader(lec));
je.read(rd, "text/html;Content-Type = windows-1251");
rd.close();
setSize (700, 400);
add(js);
this.addWindowListener(new WindowListener (){
public void windowClosing(WindowEvent e) {
BufferedWriter tm = null;
try {
BufferedWriter ctt;
ctt = new BufferedWriter(new FileWriter(Consts.pprofiles + login + ".tme"));
curtime = new Date().getTime() - curtime;
time += curtime;
ctt.write(time + "");
ctt.close();
String[] buf = new String[3];
tm = new BufferedWriter(new FileWriter(Consts.time));
BufferedReader prof = new BufferedReader(new FileReader(Consts.pprofiles + login));
buf[0] = prof.readLine();
buf[1] = prof.readLine();
prof.readLine();
prof.readLine();
buf[2] = prof.readLine();
tm.write("общее время обучения " + buf[0] + " " + buf[1] + " " + buf[2] + " : " + time + "\n");
prof.close();
tm.close();
dispose();
} catch (IOException ex) {
Logger.getLogger(KLec.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
tm.close();
} catch (IOException ex) {
Logger.getLogger(KLec.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowOpened(WindowEvent e) {}
});
setVisible (true);
}
}
Рис.3.5.2. Интерфейс окна чтения лекции
6. Интерфейс констант
Интерфейс содержит константы.
package KursPackage;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Toolkit;
public interface Consts {
public String pdatabase = new String ("d:\database.dat");//путь к базе данных
public String pprofiles = new String ("d:\profiles\");//путь к профайлам
public String prevlec = new String ("d:\lec\prev.dat");//путь к пред. лекции
public String curlec = new String ("d:\lec\cur.dat");//путь к текущей лекции
public String curtest = new String ("d:\tests\cur.dat");//путь к текущим тестам
public String prevtest = new String ("d:\tests\prev.dat");//путь к пред. тестам
public String curtesttime = new String ("d:\tests\cur.conf");//путь к файлу времени пров. тек. теста
public String prevtesttime = new String ("d:\tests\prev.conf");//путь к файлу времени пров. пред. теста
public String marks = new String ("d:\marks.dat");//путь к файлу оценок
public String log = new String ("d:\log.log");//путь к логу
public String time = new String ("d:\time.dat");//путь к логу времени
public Dimension size = new Dimension (100, 23);
public Dimension bigsize = new Dimension(size.width * 2 + 5, size.height);
public Image image = Toolkit.getDefaultToolkit().getImage("d:\icon.jpg");
}
4 Инструкция пользователя
После запуска программы появляется окно (рис. 4.1) где нужно ввести логин и пароль и нажать на кнопку «Войти».
Рис.4.1. Окно входа в систему
Если Вы еще не зарегистрированы в системе, то Вам нужно пройти регистрацию. Чтобы зарегистрироваться необходимо в окне входа в систему (рис.4.1) нажать на кнопку «Регистрация». После этого появится окно регистрации нового пользователя системы (рис. 4.2). В этом окне Вам будет предложено ввести регистрационные данные. После заполнения всех полей нажмите на кнопку «Регистрация».
Рис.4.2. Регистрация нового пользователя
Если регистрация в системе прошла успешно, то появится уведомление об успешном окончании регистрации (рис.4.3).
Рис.4.3. Успешное окончание регистрации
После регистрации Вы можете войти в систему(рис.4.4.).
Рис.4.4. Окно входа в систему под логином login и паролем password.
После нажатия на кнопку «Войти» Вы войдете в систему как login с правами пользователя. После входа в систему появится главное окно программы (рис. 4.5.).
Рис. 4.5. Главное окно системы пользователя
При нажатии на кнопку «Начать тестирование» появится окно тестирования (рис.4.6)где Вам будет дан вопрос и варианты ответа. На выполение теста будет дано определенное преподавателем.
Рис.4.6. Окно тестирования пользователя
После окончания теста Вам будет выдана оценка(рис.4.7.)
Рис.4.7. Статистика прохождения тестов.
Также в главном окне(рис.4.5) можно получить доступ к лекциям с помощью кнопки «Прочитать лекцию». После нажатия на эту кнопку появится окно (рис.4.8) с лекцией.
Рис.4.8. «Подготовка к тестам»
При авторизации в системе с правами администратора или с правами преподавателя появляется окно со следующим интерфейсом (рис.4.9.).