一、准备工作
Components类:用来定义一些比较关键的组件函数
另一个组员写的函数,包括从文件中读取用户名和密码,返回指定的文件和题目数组的初始化和重新考试。
二、登陆界面
要实现这种登录,可以用卡片式界面模拟,如果符合判定要求则翻页,否则阻止登录并弹出对话框提醒用户输入正确信息进入。
三、考试界面
分多个panel进行分装组件,因为在判断并记录选项时,如果多个不同组件一块会导致判断错误。
然后把这些放到一个大平面内。
接着实现开始考试,切题保存答案,答题卡,倒计时和保存并计算答案功能。
难点是倒计时功能,因为此功能可能会和其他点击冲突,所以需要使用多线程,将倒计时单独放在一个线程中确保两者不冲突。
代码如下:
timer = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
timeLeft--;
int minutes = timeLeft / 60;
int seconds = timeLeft % 60;
count.setText(String.format("%02d:%02d", minutes, seconds));
if (timeLeft <= 0) {
timer.stop();
overExam(jt);
up.setEnabled(false);
down.setEnabled(false);
save.setEnabled(false);
over.setEnabled(false);
answercard.setEnabled(false);
ok.setEnabled(true);
timer.stop();
Restart();
}
}
});
1.Timer timer = new Timer(1000, new ActionListener() { ... });:创建一个定时器对象 timer,并指定每隔 1000 毫秒(即 1 秒)触发一次的事件。使用了匿名内部类来创建 ActionListener 对象,实现了 actionPerformed 方法。
2.timeLeft--:将剩余时间减去 1 秒。
3.计算分钟和秒数:
int minutes = timeLeft / 60;:将剩余时间转换为分钟。
int seconds = timeLeft % 60;:计算剩余时间对 60 取模得到剩余的秒数。
count.setText(String.format("%02d:%02d", minutes, seconds));:更新显示剩余时间的文本框内容,采用 "%02d" 格式化字符串将分钟和秒数格式化为两位数,并以 ":"分隔。
3.if (timeLeft <= 0) { ... }:如果剩余时间小于等于 0,则表示时间已经用完,执行以下操作:
timer.stop();:停止定时器,防止继续触发事件。
overExam(jt);:调用 overExam 方法并传入参数 jt。
禁用一些按钮:up.setEnabled(false)、down.setEnabled(false)、save.setEnabled(false)、over.setEnabled(false)、answercard.setEnabled(false),并启用 ok 按钮。
timer.stop();:再次停止定时器,虽然之前已经停止,但这里再次调用是为了确保定时器被完全关闭。
Restart();:调用 Restart 方法重新初始化答案数组。
然后启动线程:
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
timer.start();
}
});
通过调用SwingUtilities.invokeLater方法,将一个新的Runnable任务添加到事件分派线程的队列中。这个Runnable任务的run方法会在稍后的时间点被事件分派线程调用。