📄 scjptest.java
字号:
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import java.applet.Applet;
import java.text.NumberFormat;
public class ScjpTest {
public static void main(String args[]){
Frame f = new Frame("ScjpTest");
SubPanel sp = new SubPanel();
sp.inital();
f.add(sp);
f.setSize(800,550);
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(1);
}
});
}
}
class SubPanel extends Panel
implements ActionListener,ItemListener{
private Checkbox mark = new Checkbox("Mark");
private Button review = new Button("Review");
private Button finish = new Button("Finish");
private Button clear = new Button("Clear");
private Button back = new Button("Back");
private Button next = new Button("Next");
private Button jump = new Button("Goto");
private TextField to = new TextField(4);
private TextArea ta = new TextArea(" ",10,30,1);
private Label qIndex = new Label("Question No.");
private Label qNote = new Label("Select correct answer(s)");
private Label timer = new Label("");
private Panel answerPanel = new Panel();
private Dialog rep = new Dialog(new Frame());
private Dialog rew = new Dialog(new Frame());
private Question[] qs;
private int idx = 0;
private String[] itemIdx = {
"A)","B)","C)","D)","E)","F)","G)"
};
public void inital(){
this.setLayout(new BorderLayout());
Panel p1 = new Panel(),
p2 = new Panel(),
p3 = new Panel(),
p4 = new Panel(),
p5 = new Panel(),
p6 = new Panel(),
p7 = new Panel();
p1.setLayout(new GridLayout(1,2));
p1.add(p2);
p1.add(p3);
p2.setLayout(new FlowLayout(FlowLayout.LEFT));
p2.add(mark);
p3.setLayout(new FlowLayout(FlowLayout.RIGHT));
p3.add(review);
p3.add(finish);
p3.add(timer);
this.add(p1,"North");
p4.add(clear);
p4.add(back);
p4.add(next);
p4.add(jump);
p4.add(to);
this.add(p4,"South");
p5.setLayout(new GridLayout(2,1));
p5.add(p6);
p5.add(p7);
p6.setLayout(new BorderLayout());
p6.add(qIndex,"North");
p6.add(ta,"Center");
p7.setLayout(new BorderLayout());
p7.add(qNote,"North");
p7.add(answerPanel,"Center");
answerPanel.setLayout(new GridLayout(7,1));
this.add(p5,"Center");
this.createQuestion();
display(answerPanel,qs[idx]);
ta.setEditable(false);
qIndex.setFont(new Font("Dialog",Font.PLAIN,14));
qNote.setFont(new Font("Dialog",Font.PLAIN,14));
timer.setFont(new Font("Impact",Font.PLAIN,20));
this.setButtonState();
//注册事件监听器
review.addActionListener(this);
finish.addActionListener(this);
clear.addActionListener(this);
back.addActionListener(this);
next.addActionListener(this);
jump.addActionListener(this);
mark.addItemListener(this);
MyClock mc = new MyClock(timer,this);
mc.start();
}
public void display(Panel p,Question q){
ta.setText(q.getDetail());
mark.setState(q.getMarked());
p.removeAll();
Vector choice = q.getChoice();
int size = choice.size();
for(int j=0;j<size;j++){
Panel p1 = new Panel();
p1.setLayout(new FlowLayout(FlowLayout.LEFT));
Checkbox cb = new Checkbox(itemIdx[j]);
cb.setState(q.getSelectedAnswer().charAt(j) == '1');
cb.addItemListener(this);
p1.add(cb);
p1.add(new Label(choice.elementAt(j).toString()));
p.add(p1,j);
}
qIndex.setText("Question " + (idx+1) + " of " + qs.length);
qNote.setText(q.getNote());
this.validateTree();
}
public void createQuestion(){
Vector qStore = new Vector();
try{
FileReader fr = new FileReader("data.xml");
BufferedReader br = new BufferedReader(fr);
while(true){
Question q = ReadQuestion(br);
if(q == null){
break;
}
qStore.add(q);
}
br.close();
}catch(IOException e){
e.printStackTrace();
}
qs = new Question[qStore.size()];
for(int i=0; i<qStore.size();i++){
qs[i] = (Question)qStore.elementAt(i);
}
}
public Question ReadQuestion(BufferedReader br){
Question q = new Question();
try{
String s = br.readLine();
while(s!=null && (!s.equals("<question>"))){
s = br.readLine();
}
s = br.readLine();
while(s!=null && (!s.equals("<note>"))){
s = br.readLine();
}
if(s == null) return null;
q.setNote(br.readLine());
s = br.readLine();
if(!s.equals("</note>")){
return null;
}
s = br.readLine();
while(s!=null && (!s.equals("<detail>"))){
s = br.readLine();
}
if(s == null) return null;
StringBuffer sb = new StringBuffer("");
s = br.readLine();
while(s!=null && (!s.equals("</detail>"))){
sb.append(s + "\n");
s = br.readLine();
}
q.setDetail(sb.toString());
if(s == null) return null;
s = br.readLine();
while(s!=null && (!s.equals("<choice>"))){
s = br.readLine();
}
if(s == null) return null;
Vector vc = new Vector();
s = br.readLine();
while(s!=null && (!s.equals("</choice>"))){
vc.add(s);
s = br.readLine();
}
q.setChoice(vc);
if(s == null) return null;
s = br.readLine();
while(s!=null && (!s.equals("<answer>"))){
s = br.readLine();
}
if(s == null) return null;
q.setStandardAnswer(br.readLine());
q.setSelectedAnswer(q.getStandardAnswer());
q.reset();
s = br.readLine();
if(!s.equals("</answer>")){
return null;
}
s = br.readLine();
while(s!=null && (!s.equals("</question>"))){
s = br.readLine();
}
if(s == null) return null;
}catch(IOException e){
e.printStackTrace();
}
return q;
}
public void actionPerformed(ActionEvent e){
String s = e.getActionCommand();
if(s.equals("Finish")){
this.report();
}else if(s.equals("Review")){
this.survey();
}
if(s.equals("Next")){
idx ++;
}else if(s.equals("Back")){
idx --;
}else if(s.equals("Clear")){
qs[idx].reset();
}else if(s.equals("Goto")){
try{
int i = Integer.parseInt(to.getText())-1;
if(i>=0 && i<qs.length)
idx = i;
}catch(Exception e1){}
to.setText("");
}
display(answerPanel,qs[idx]);
this.setButtonState();
}
public void setButtonState(){
if(idx == 0){
back.setEnabled(false);
}else{
back.setEnabled(true);
}
if(idx == qs.length-1){
next.setEnabled(false);
}else{
next.setEnabled(true);
}
}
public void itemStateChanged(ItemEvent e){
qs[idx].setAttempted(true);
Checkbox source = (Checkbox)e.getSource();
String item = source.getLabel();
boolean state = source.getState();
if(item.equals("Mark")){
if(mark.getState() == true){
qs[idx].setMarked(true);
}else{
qs[idx].setMarked(false);
}
return;
}
for(int i=0;i<itemIdx.length;i++){
if(item.equals(itemIdx[i])){
String s = qs[idx].getSelectedAnswer();
StringBuffer sb = new StringBuffer(s);
sb.setCharAt(i,state == true ? '1' : '0');
qs[idx].setSelectedAnswer(sb.toString());
break;
}
}
}
public void survey(){
rew = new Dialog(new Frame());
Label title = new Label(" Review Report");
title.setFont(new Font("Impact",Font.PLAIN,20));
rew.add(title,"North");
TextArea revTa = new TextArea("",20,20,1);
revTa.setEditable(false);
revTa.setText("QuetNo.\tMarked\tAttempted\n");
revTa.append("-------------------------\n");
for(int i=0;i<qs.length;i++){
revTa.append((i+1) + "\t"
+ ((qs[i].getMarked()==true)?"yes":" ") + "\t"
+ ((qs[i].getAttempted()==true)?"yes":"") + "\n");
}
rew.add(revTa);
Button ok = new Button("OK");
ok.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
rew.dispose();
}
});
Panel p = new Panel();
p.add(ok);
rew.add(p,"South");
rew.setSize(300,200);
rew.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
rew.dispose();
}
});
rew.setVisible(true);
}
public void report(){
int score = 0;
for(int i=0;i<qs.length;i++){
if(qs[i].checkAnswer()){
score++;
}
}
rep = new Dialog(new Frame());
Label title = new Label(" Current Test Report");
title.setFont(new Font("Impact",Font.PLAIN,20));
rep.add(title,"North");
Panel content = new Panel();
content.setLayout(new GridLayout(3,1));
content.add(new Label("\tTotal Questions:\t" + qs.length));
content.add(new Label("\tCorrect Attempts:\t" + score));
content.add(new Label("\tYour Marks:\t\t" + (score*100/qs.length) + "%"));
rep.add(content,"Center");
Button ok = new Button("OK");
ok.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
rep.dispose();
}
});
Panel p = new Panel();
p.add(ok);
rep.add(p,"South");
rep.setSize(200,160);
rep.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
rep.dispose();
}
});
rep.setVisible(true);
}
}
class Question{
private String note = "multiple selection";
private String detail = " ";
private Vector choice = null;
private String standardAnswer;
private String selectedAnswer;
private boolean marked = false;
private boolean attempted = false;
public String getNote(){
return note;
}
public String getDetail(){
return detail;
}
public Vector getChoice(){
return choice;
}
public String getStandardAnswer(){
return standardAnswer;
}
public String getSelectedAnswer(){
return selectedAnswer;
}
public boolean getMarked(){
return marked;
}
public boolean getAttempted(){
return attempted;
}
public void setNote(String s){
note = s;
}
public void setDetail(String s){
detail = s;
}
public void setChoice(Vector c){
choice = c;
}
public void setStandardAnswer(String s){
standardAnswer = s;
}
public void setSelectedAnswer(String s){
selectedAnswer = s;
}
public void setMarked(boolean m){
marked = m;
}
public void setAttempted(boolean a){
attempted = a;
}
public void reset(){
selectedAnswer = selectedAnswer.replace('1','0');
}
public boolean checkAnswer(){
if(standardAnswer.equals(selectedAnswer))
return true;
return false;
}
public String toString(){
return (standardAnswer + "\t" + selectedAnswer);
}
}
class MyClock extends Thread{
private Label timer;
private SubPanel sp;
public MyClock(Label t,SubPanel p){
timer = t;
sp = p;
}
public void run(){
NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumIntegerDigits(2);
long startTime = System.currentTimeMillis();
long endTime = startTime + 2*60*60*1000;
long now;
int last,h,m,s;
while(true){
now = System.currentTimeMillis();
last = (int)((endTime - now)/1000);
if(last<=0){
timer.setText("Time out!");
break;
}
h = last/3600;
m = last%3600/60;
s = last%60;
StringBuffer sb = new StringBuffer("");
sb.append(nf.format(h) + ":" + nf.format(m)
+ ":" + nf.format(s));
timer.setText(sb.toString());
try{
Thread.sleep(1000);
}catch(Exception e){
e.printStackTrace();
}
}
sp.report();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -