手把手教你用Java打造一款簡單考試系統(tǒng)之二
上篇文章我們介紹了簡單考試系統(tǒng)的理論部分,這篇文章我們來一起看下其具體的實現(xiàn)。
一、項目背景
隨著移動互聯(lián)網(wǎng)的發(fā)展,網(wǎng)絡給我們帶來的是無窮的信息,也帶來了便利。與傳統(tǒng)考試模式相對比,在線考試具有很多優(yōu)越性、它可以將傳統(tǒng)考試過程中的試卷組織、傳送、收集、評判等各環(huán)節(jié)縮小到一至兩個環(huán)節(jié),不僅可以節(jié)約大量的時間、人力、物力與財力,還可以大幅度提高考試的客觀性和公正性。利用現(xiàn)有的計算機硬、軟件和網(wǎng)絡資源實現(xiàn)無紙質(zhì)考試以避免傳統(tǒng)考試的不足。
二、項目目標
設計一款應用程序,顯示駕照考試科目一的題目,進行計時,當用戶提交試卷后,判斷用戶的做題情況,統(tǒng)計得分,并顯示考試結果。
三、項目實施
首先回顧上一節(jié)的Java簡單考試系統(tǒng)(上篇),完成界面的窗口、題目和選項、顯示進度、顯示按鈕和時間、顯示總分和表情,效果如下圖所示。
接下來,小編帶大家完成剩下的功能,具體的實現(xiàn)步驟如下。
(一)顯示背景圖,完成界面設計
1.setOpaque設置控件是否透明的,true表示不透明,false表示透明;
- buttona.setOpaque(false);
- buttonb.setOpaque(false);
- buttonc.setOpaque(false);
- buttond.setOpaque(false);
- panel01.setOpaque(false);
- panel02.setOpaque(false);
- panel03.setOpaque(false);
- panel04.setOpaque(false);
2.設置邊界
- label.setBounds(0, 0, bg.getIconWidth(), bg.getIconHeight());
3.把整個窗格轉(zhuǎn)化為面板
- imagePanel=(JPanel)this.getContentPane();
- imagePanel.setOpaque(false);
4.把背景圖添加到分層窗格的最底層
- this.getLayeredPane().add(label,new Integer(Integer.MIN_VALUE));
效果圖如下圖所示:
(二)給控件屬性添加監(jiān)聽事件
- btn_last.addActionListener(ml);
- btn_next.addActionListener(ml);
- btn_finish.addActionListener(ml);
- buttona.addActionListener(ml);
- buttonb.addActionListener(ml);
- buttonc.addActionListener(ml);
- buttond.addActionListener(ml);
(三)創(chuàng)建計時器,然后讓計時器啟動
- timer = new Timer(1000,new TimerListener());
- timer.start();
(四)完成事件處理
1.紅色按鈕表示未做的題,綠色表示已做的題。
- public class MyListener implements ActionListener{
- @Override
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
- for(int i=0;i<5;i++){
- if(e.getSource()==btn_index[i]){//按鈕1到5
- num = i;//更新當前題號
- showItem(num);//切換題目和選項
- showMychoice(num);//顯示已選選項
- showButton(num);//判斷顯示哪些按鈕
- }
- }
(1)實現(xiàn)上一題功能
- if(e.getSource()==btn_last){
- if(num>0){
- num--;
- }
- showItem(num);
- showMychoice(num);
- showButton(num);
- }
(2)實現(xiàn)下一題功能
- if(e.getSource()==btn_next){
- if(num<str_problem.length-1){
- num++;
- }
- showItem(num);
- showMychoice(num);
- showButton(num);
- }
(3)實現(xiàn)單選功能
- if(e.getSource()==buttona){
- my_answer[num]=1;
- btn_index[num].setBackground(Color.GREEN);
- }
- if(e.getSource()==buttonb){
- my_answer[num]=2;
- btn_index[num].setBackground(Color.GREEN);
- }
- if(e.getSource()==buttonc){
- my_answer[num]=3;
- btn_index[num].setBackground(Color.GREEN);
- }
- if(e.getSource()==buttond){
- my_answer[num]=4;
- btn_index[num].setBackground(Color.GREEN);
- }
(4)交卷,停止計時器
- if(e.getSource()==btn_finish){//交卷
- timer.stop();//停止
- TextFinish();
- }
- }
- }
效果圖如下圖:
2.用戶自己提交試卷,當分數(shù)不是滿分則顯示大哭的表情。
(1)設置選中的答案
- public void showItem(int i){
- problem.setText(str_problem[i]);
- buttona.setText(answer_a[i]);
- buttonb.setText(answer_b[i]);
- buttonc.setText(answer_c[i]);
- buttond.setText(answer_d[i]);
- group.clearSelection();//清空
- }
(2)顯示已選選項,i為當前題號
- public void showMychoice(int i){
- switch(my_answer[i]){
- case 1:
- buttona.setSelected(true);
- break;
- case 2:
- buttonb.setSelected(true);
- break;
- case 3:
- buttonc.setSelected(true);
- break;
- case 4:
- buttond.setSelected(true);
- break;
- }
- }
(3)判斷顯示哪些按鈕,i為當前題號
- public void showButton (int i){
- if(i==0){//第一題
- btn_last.setEnabled(false);
- btn_next.setEnabled(true);
- }else if(i==str_problem.length-1){//最后一題
- btn_last.setEnabled(true);
- btn_next.setEnabled(false);
- }else{//其余題
- btn_last.setEnabled(true);
- btn_next.setEnabled(true);
- }
- }
(4)考試結束的方法
- public void TextFinish(){
- btn_last.setEnabled(false);//不能點擊
- btn_next.setEnabled(false);
- btn_finish.setEnabled(false);
- buttona.setEnabled(false);
- buttonb.setEnabled(false);
- buttonc.setEnabled(false);
- buttond.setEnabled(false);
- }
4.1判斷用戶選的答案是否正確
- for(int i=0;i<4;i++){
- btn_index[i].setEnabled(false);
- if(my_answer[i]==right[i]){
- score=score+20;
- }
- }
4.2 設置分數(shù),如果分數(shù)等于100分笑臉,反之哭臉
- label_score.setText("總成績:"+score);
- if(score==100){
- image.setIcon(new ImageIcon("image//lauge.jpg"));
- }else{
- image.setIcon(new ImageIcon("image//cry.jpg"));
- }
- }
效果圖如下圖:
3.考試時間到,系統(tǒng)自動提交試卷。當分數(shù)為滿分則顯示大笑的表情。
- public class TimerListener implements ActionListener{
- @Override
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
- second--;
- if(second<0){
- minute--;
- second=59;
- }
- label_time.setText(minute+":"+second);
- if(minute==0 && second==0){
- timer.stop();
- label_time.setText("考試結束!");
- TextFinish();
- }
- }
- }
效果圖如下圖:
四、總結
1.介紹了JLabel、JButton、JPanel、ButtonGroup、JRadioButton單選框組件的基本使用,以及相應的事件處理,完成界面的設計。
2.事件處理函數(shù)的添加,難點是運用理解構造函數(shù)、內(nèi)部類的創(chuàng)建。這些代碼比較簡單,也是一個簡單的小案例,希望對你有所幫助!
3.如果有需要本文項目代碼的小伙伴,可以在后臺回復“考試系統(tǒng)”四個字進行獲取。
本文轉(zhuǎn)載自微信公眾號「Java進階學習交流」,可以通過以下二維碼關注。轉(zhuǎn)載本文請聯(lián)系Java進階學習交流公眾號。