一、设计思路
二、代码+分析
登陆界面 class Login extends JFrame
导入的包
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
声明的组件
String s1, s2, s3;//姓名、学号、班级
JLabel jl1 = new JLabel("小学生计算考试练习系统");
JLabel jl2 = new JLabel("请填写个人信息");
JLabel jlName = new JLabel("姓名:");
JLabel jlID = new JLabel("学号:");
JLabel jlClass = new JLabel("班级:");
JLabel jlTime = new JLabel("时间:");
JLabel jl3 = new JLabel(" ");
JLabel jl4 = new JLabel(" ");
JTextField jtName = new JTextField(15);
JTextField jtID = new JTextField(15);
JTextField jtClass = new JTextField(15);
JTextField jtTime = new JTextField(15);
JButton jb1 = new JButton("开始考试");
JButton jb2 = new JButton("重置信息");
JPanel jp1 = new JPanel();
JPanel jp2 = new JPanel();
JPanel jp3 = new JPanel();
JPanel jp4 = new JPanel();
JPanel jp5 = new JPanel();
JPanel jp6 = new JPanel();
JPanel jp7 = new JPanel();
JPanel jp8 = new JPanel();
这里声明了八个JPanel,分别承载:主标题"小学生计算考试练习系统"、次标题"请填写个人信息"、姓名、学号、班级、自定义时间、面板2~6、”开始考试“和”重置信息“按钮。
Event方法
public void Event(){
//填写信息
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//没有输入信息
if(jtName.getText().equals("") || jtID.getText().equals("") || jtClass.getText().equals("")) {
String s = "请输入完整信息";
JOptionPane.showMessageDialog(null, s,"提示",JOptionPane.ERROR_MESSAGE);
}else {
setVisible(false);
dispose();
s1 = jtName.getText();
s2 = jtID.getText();
s3 = jtClass.getText();
new StartTest(Integer.parseInt(jtTime.getText()),s1,s2,s3);
}
}
});
//重置信息
jb2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jtName.setText(null);
jtID.setText(null);
jtClass.setText(null);
}
});
}
构造器
public Login(){
super("小学生计算考试练习系统");
Container c = getContentPane();
c.setLayout(new BorderLayout(20,20));//间隔20像素
jl1.setFont(new Font("黑体",Font.BOLD,35));
jl1.setForeground(Color.BLUE);
jp1.add(jl1);
c.add(jp1, BorderLayout.NORTH);
jl2.setFont(new Font("黑体",Font.BOLD,25));
jl2.setForeground(Color.red);
jp2.add(jl2);
jlName.setFont(new Font("黑体",Font.BOLD,15));
jp3.add(jlName);
jp3.add(jtName);
jlID.setFont(new Font("黑体",Font.BOLD,15));
jp4.add(jlID);
jp4.add(jtID);
jlClass.setFont(new Font("黑体",Font.BOLD,15));
jp5.add(jlClass);
jp5.add(jtClass);
jlTime.setFont(new Font("黑体",Font.BOLD,15));
jp6.add(jlTime);
jp6.add(jtTime);
jp7.add(jp2);
jp7.add(jp3);
jp7.add(jp4);
jp7.add(jp5);
jp7.add(jp6);
jp7.setLayout(new GridLayout(5,1));
c.add(jp7,BorderLayout.CENTER);
jp8.add(jl4);
jp8.add(jb1);
jp8.add(jl3);
jp8.add(jb2);
c.add(jp8,BorderLayout.SOUTH);
Event();
}
- Container c的布局管理器是BorderLayout,并且设置其各部分间隔20像素
- 面板jp7采用GridLayout,5行1列,分别是次标题、姓名、学号、班级、自定义时间。将其置于容器的中间CENTER。
- 面板jp8默认流布局管理器。将其置于容器的底部SOUTH。
考试界面 class StartTest extends JFrame
导入的包
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
声明的组件
int a, b, c,count = 1;
String Name, ID, Class;
JLabel jlPage = new JLabel();//显示第几页
JLabel jlTotal = new JLabel(" 共5页 ");
JLabel jlTime = new JLabel("考试时间还剩:");
JLabel jlMinutes = new JLabel();
JLabel jlSeconds = new JLabel();
JButton jb1 = new JButton("提交试卷");
JButton jb2 = new JButton("首页");
JButton jb3 = new JButton("上一页");
JButton jb4 = new JButton("下一页");
JButton jb5 = new JButton("尾页");
JLabel[] jlQuestion = new JLabel[50];//50个题目
JTextField[] jtAnswer = new JTextField[50];//50个考生答案
int[] answer = new int[50];//50个标准答案
String[] rightAnswer = new String[50];//50个标准答案
boolean[] flag = new boolean[50];//对错的标志
JPanel jp1 = new JPanel();//承载考试时间
JPanel jp2 = new JPanel();//置于NORTH
JPanel jp3 = new JPanel();//置于CENTER
JPanel jp4 = new JPanel();//置于SOUTH
CardLayout cl = new CardLayout();
private int time, endTime;
Event 方法
倒计时
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
int minutes = endTime / 60;
int seconds = endTime - minutes * 60;
endTime--;
jlMinutes.setText("" + minutes + "分");
jlSeconds.setText("" + seconds + "秒");
if(endTime == 0) jb1.doClick();//考试时间到,交卷
}
},0,1000);
交卷按钮
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
timer.cancel();
String s1 = "", s2 = "";
int correctAnswer = 0;
for(int i = 0; i < 50; i++) {
rightAnswer[i] = Integer.toString(answer[i]);
if(jtAnswer[i].getText().equals(rightAnswer[i])) {
flag[i] = true;
correctAnswer++;
}
else {
s1 += jlQuestion[i].getText() + jtAnswer[i].getText()
+ " × 标准答案:" + rightAnswer[i] + "\n";
flag[i] = false;
}
s2 += jlQuestion[i].getText() +
" 考生答案:" + jtAnswer[i].getText() +
" 标准答案:" + rightAnswer[i] + " " +
(flag[i] ? "√" : "×") + "\n";
}
String s="共50道题\n";
s += "答对" + correctAnswer + "道题\n";
s += "答错" + (50 - correctAnswer) + "道题\n";
s += "用时" + (time - endTime) + "秒\n";
s += "得分" + (correctAnswer * 2) + "分\n";
JOptionPane.showMessageDialog(null, s,"考试结束",JOptionPane.INFORMATION_MESSAGE);
s2 += "\n学号:" + ID + "\n姓名:" + Name + "\n班级:" + Class +
"\n最终成绩为:" + correctAnswer * 2 + "\n";
try {
FileOutputStream f1 = new FileOutputStream("错题集.txt");
FileOutputStream f2 = new FileOutputStream("答题结果.txt");
byte[] b1 = s1.getBytes();
byte[] b2 = s2.getBytes();
f1.write(b1);
f1.flush();
f1.close();
f2.write(b2);
f2.flush();
f2.close();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
});
首页
jb2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cl.first(jp3);
count = 1;
jlPage.setText("第" + count +"页");
}
});
上一页
jb3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if ( count > 1 && count <= 5){
cl.previous(jp3);
count --;
}
else {
String s = "已经是第一页";
JOptionPane.showMessageDialog(null, s,"提示",JOptionPane.ERROR_MESSAGE);
};
jlPage.setText("第" + count + "页");
}
});
下一页
jb4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if ( count >= 1 && count < 5 ) {
cl.next(jp3);
count ++;
}
else {
String s = "已经是最后一页";
JOptionPane.showMessageDialog(null, s,"提示",JOptionPane.ERROR_MESSAGE);
};
jlPage.setText("第" + count + "页");
}
});
尾页
jb5.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cl.last(jp3);
count = 5;
jlPage.setText("第" + count +"页");
}
});
构造器
public StartTest(int time, String name, String id, String Class){
super("开始考试");
this.time = time;
this.endTime = time;
this.Name = name;
this.ID = id;
this.Class = Class;
this.setSize(500,500);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new BorderLayout(20,20));
jp1.add(jlMinutes);
jp1.add(jlSeconds);
jlPage.setText("第" + count + "页");
jp2.setLayout(new FlowLayout());
jp2.add(jlPage);//页数
jp2.add(jlTotal);
jp2.add(jlTime);
jp2.add(jp1);
jp2.add(jb1);
this.add(jp2,BorderLayout.NORTH);
jp3.setLayout(cl);
this.add(jp3,BorderLayout.CENTER);
for (int i = 0, k = 0; i < 5; i++) {
JPanel p = new JPanel(new GridLayout(10,2));
for(int j = 0 ; j < 10 ; j++) {
a = (int)(Math.random()*100+1);
b = (int)(Math.random()*100+1);
c = (int)(Math.random()*100+1);
while(a + b < c) c = (int)(Math.random()*100+1);
jlQuestion[k] = new JLabel("" + (k+1) + "、 " + a + "+" + b + "-" + c + "=");
jlQuestion[k].setFont(new Font("黑体",Font.BOLD,15));
p.add(jlQuestion[k]);
answer[k] = a + b - c;
jtAnswer[k] = new JTextField();
p.add(jtAnswer[k]);
k++;
}
JScrollPane sp = new JScrollPane(p);
jp3.add(sp);
}
jp4.setLayout(new GridLayout(1,4));
jp4.add(jb2);
jp4.add(jb3);
jp4.add(jb4);
jp4.add(jb5);
this.add(jp4, BorderLayout.SOUTH);
Event();
this.setVisible(true);
}
三、最终演示
错题集:
答题情况: