免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4800 | 回复: 1
打印 上一主题 下一主题

很简单的在线考试系统 [复制链接]

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-07-11 22:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-07-14 09:35 |只看该作者 |倒序浏览
学习java swing,写下的考试系统,主要功能就是在线答题,随机出题目。在线测试,保存题目。
MainFrame.java
  1. package com.wang;

  2. import java.awt.BorderLayout;
  3. import java.awt.Container;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;

  6. import javax.swing.JFrame;
  7. import javax.swing.JScrollPane;
  8. import javax.swing.JTextArea;

  9. import com.wang.ctrl.ArithmeticController;
  10. import com.wang.view.ButtonsPane;
  11. import com.wang.view.NorthPane;

  12. public class MainFrame extends JFrame {

  13.     public MainFrame(String title){
  14.         super(title);
  15.         NorthPane north = new NorthPane();//添加北区面板
  16.          
  17.         JTextArea area = new JTextArea();//中间区域的面板用来存放所有题目答题者的对错情况,就是用来存放arithmetic
  18.         area.setEditable(false);//这块区域不可以编辑
  19.          
  20.         String[] titles = {"开始","显示","保存","退出"};
  21.         ButtonsPane buttonsPane = new ButtonsPane(4);//buttonspane用啦产生button的
  22.         buttonsPane.setTitles(titles);
  23.          

  24.         ArithmeticController controller = new ArithmeticController(north,area,buttonsPane);
  25.          
  26.         Container c = this.getContentPane();
  27.         c.add(north, BorderLayout.NORTH);
  28.         c.add(new JScrollPane(area));
  29.         c.add(buttonsPane,BorderLayout.SOUTH);
  30.         this.setSize(320,500);
  31.         this.setResizable(false);
  32.         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  33.         this.setVisible(true);
  34.     }
  35.     /**
  36.      * @param args
  37.      */
  38.     public static void main(String[] args) {
  39.         // TODO Auto-generated method stub
  40.         new MainFrame("速算练习系统");
  41.     }

  42. }
复制代码
ArithmeticView.java
  1. package com.wang.view;

  2. import java.awt.Color;
  3. import java.awt.Dimension;
  4. import java.awt.GridLayout;
  5. import java.awt.event.ActionListener;

  6. import javax.swing.JLabel;
  7. import javax.swing.JPanel;
  8. import javax.swing.JTextField;
  9. import javax.swing.SwingConstants;

  10. import com.wang.domain.Arithmetic;

  11. public class ArithmeticView extends JPanel {
  12.     private JLabel[] labels;//JLabel数组
  13.     private JTextField field;
  14.      
  15.     //题目的分区哟格式四个labels,以及一个用户输入的textfield
  16.      
  17.     public ArithmeticView(){
  18.         setLayout(new GridLayout(1,5,1,1));//布局
  19.         labels = new JLabel[4];
  20.         //初始化每一个labels,可见,背景等等
  21.         for(int i = 0; i < labels.length; i++){
  22.             labels[i] = new JLabel();
  23.             labels[i].setHorizontalAlignment(SwingConstants.CENTER);
  24.             labels[i].setOpaque(true);
  25.             labels[i].setBackground(Color.white);
  26.             add(labels[i]);//添加到arithmetic面板
  27.         }
  28.         field = new JTextField();
  29.         field.setEnabled(false);//不可编辑
  30.         add(field);
  31.     }
  32.      
  33.     //设置arithmeticView里面的值,变成字符串,内容在arithmetic获取
  34.     public void setArithmetic(Arithmetic arithmetic){
  35.         labels[0].setText(String.valueOf(arithmetic.getLeft()));
  36.         labels[1].setText(Arithmetic.convert(arithmetic.getOp()));
  37.         labels[2].setText(String.valueOf(arithmetic.getRight()));
  38.         labels[3].setText("=");
  39.     }
  40.     public void setEnabled(boolean b){
  41.         field.setEnabled(b);
  42.         if(b){
  43.             field.grabFocus();
  44.         }
  45.     }
  46.     public JTextField getNumberField(){
  47.         return this.field;
  48.     }
  49.      
  50.     public void addActionListenerForField(ActionListener listener){
  51.         field.addActionListener(listener);
  52.     }
  53.     @Override
  54.     public Dimension getPreferredSize() {
  55.         // TODO Auto-generated method stub
  56.         return new Dimension(330,30);
  57.     }

  58.     @Override
  59.     public Dimension getMaximumSize() {
  60.         // TODO Auto-generated method stub
  61.         return new Dimension(340,30);
  62.     }

  63.     @Override
  64.     public Dimension getMinimumSize() {
  65.         // TODO Auto-generated method stub
  66.         return new Dimension(320,30);
  67.     }
  68.      
  69.      
  70. }
复制代码
ButtonsPane.java
  1. package com.wang.view;

  2. import java.awt.event.ActionListener;

  3. import javax.swing.JButton;
  4. import javax.swing.JPanel;

  5. public class ButtonsPane extends JPanel{//buttonspane继承JPanel这样可以添加JPanel面板

  6.     private JButton[] buttons;//用JButton数组定义buttons数组
  7.     private int size;
  8.      
  9.     public ButtonsPane(){
  10.         this(2);
  11.     }
  12.     public ButtonsPane(int amt){//向面板增加了五个buttons
  13.         size = amt;
  14.         buttons = new JButton[size];
  15.         for(int i = 0; i < size; i++){
  16.             buttons[i] = new JButton();
  17.             add(buttons[i]);
  18.         }
  19.     }
  20.     public void setTitles(String[] titles){//把string数组里面的各个成员转变成button的标题的函数
  21.         if(titles.length != size){
  22.             
  23.         }
  24.         for(int i = 0; i < size; i++){
  25.             buttons[i].setText(titles[i]);//定义每个按钮的标题
  26.         }
  27.     }
  28.      
  29.     //定义按钮是否可用,包含两个参数,一个序号加上true  or false定义是否可用啊。
  30.     public void setEnabled(int index,boolean b)throws RuntimeException{
  31.         if(index < 0 || index >= size){
  32.             throw new RuntimeException("下标越界");
  33.         }
  34.         buttons[index].setEnabled(b);
  35.     }
  36.      
  37.      
  38.     public JButton[] getButtons(){
  39.         return buttons;
  40.     }
  41.      
  42.     //为对应的按钮添加监听事件
  43.     public void addActionListener(int index, ActionListener listener){
  44.         buttons[index].addActionListener(listener);
  45.     }
  46. }
复制代码
ClockView.java
  1. package com.wang.view;

  2. import java.awt.Dimension;
  3. import java.awt.Graphics;
  4. import java.awt.Graphics2D;

  5. import javax.swing.JPanel;

  6. import com.wang.domain.Clock;

  7. public class ClockView extends JPanel {
  8.     private Clock clock;
  9.      
  10.     public void setClock(Clock clock){
  11.         this.clock = clock;
  12.     }

  13.     @Override
  14.     protected void paintComponent(Graphics g) {
  15.         // TODO Auto-generated method stub
  16.         super.paintComponent(g);
  17.         if(clock != null){
  18.             Graphics2D g2 = (Graphics2D)g;
  19.             clock.drawClock(g2);
  20.         }
  21.     }

  22.     public void move(){
  23.         if(clock != null){
  24.             clock.move();
  25.         }
  26.     }
  27.     @Override
  28.     public Dimension getPreferredSize() {
  29.         // TODO Auto-generated method stub
  30.         return new Dimension(30,30);
  31.     }

  32.      
  33.     @Override
  34.     public Dimension getMaximumSize() {
  35.         // TODO Auto-generated method stub
  36.         return new Dimension(30,30);
  37.     }

  38.     @Override
  39.     public Dimension getMinimumSize() {
  40.         // TODO Auto-generated method stub
  41.         return new Dimension(30,30);
  42.     }
  43.      
  44. }
复制代码
MessagePane.java
  1. package com.wang.view;

  2. import java.awt.BorderLayout;

  3. import javax.swing.JPanel;

  4. import com.wang.domain.Clock;

  5. public class MessagePane extends JPanel {
  6.     private ClockView clockView;
  7.     private TipPane tipPane;
  8.      
  9.     public MessagePane(){
  10.         setLayout(new BorderLayout());
  11.         tipPane = new TipPane("");
  12.         clockView = new ClockView();
  13.         Clock clock = new Clock(clockView);
  14.         clockView.setClock(clock);
  15.          
  16.         add(clockView,BorderLayout.WEST);
  17.         add(tipPane);
  18.     }
  19.     public void move(){
  20.         clockView.move();
  21.     }
  22. }
复制代码
NorthPane.java
  1. package com.wang.view;

  2. import java.awt.GridLayout;
  3. import java.awt.event.ActionListener;

  4. import javax.swing.BorderFactory;
  5. import javax.swing.JPanel;
  6. import javax.swing.JTextField;
  7. import javax.swing.border.BevelBorder;
  8. import javax.swing.border.Border;

  9. import com.wang.domain.Arithmetic;

  10. public class NorthPane extends JPanel {//整个的北区,其中msgpane是包含的一个始终和一个提示语
  11.     private ArithmeticView arithView;//ArithmeticView是用来展示题目的一个视图
  12.     private MessagePane msgPane;
  13.      
  14.     public NorthPane(){
  15.         setLayout(new GridLayout(2,1,1,1));
  16.         Border border = BorderFactory.createBevelBorder(BevelBorder.LOWERED);
  17.         msgPane = new MessagePane();
  18.         msgPane.setBorder(border);
  19.          
  20.         arithView = new ArithmeticView();
  21.         border = BorderFactory.createBevelBorder(BevelBorder.RAISED);
  22.         arithView.setBorder(border);
  23.          
  24.         add(msgPane);
  25.         add(arithView);
  26.     }
  27.     public void setArithmetic(Arithmetic arithmetic){
  28.         arithView.setArithmetic(arithmetic);
  29.     }
  30.     public void setEnabled(boolean b){
  31.         arithView.setEnabled(b);
  32.     }
  33.      
  34.      
  35.     public JTextField getNumberField(){
  36.         return arithView.getNumberField();
  37.     }
  38.      
  39.     //位arithView面板添加监听事件,northPane可以监听arithView面板的事件
  40.     public void addActionListenerForField(ActionListener listener){
  41.         arithView.addActionListenerForField(listener);
  42.     }
  43.      
  44.      
  45.     public void move(){
  46.         msgPane.move();
  47.     }
  48. }
复制代码
TipPane.java
  1. package com.wang.view;

  2. import java.awt.GridLayout;

  3. import javax.swing.JLabel;
  4. import javax.swing.JPanel;

  5. public class TipPane extends JPanel {

  6.     private JLabel label;
  7.      
  8.     public TipPane(String tip){
  9.         setLayout(new GridLayout(1,1));
  10.         label = new JLabel(tip);
  11.         add(label);
  12.     }
  13.     public void setTip(String tip){
  14.         label.setText(tip);
  15.     }
  16. }
复制代码
Arithmetic.java
  1. package com.wang.domain;

  2. import java.io.FileNotFoundException;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.OutputStream;

  6. public class Arithmetic {
  7.     private int left;
  8.     private int right;
  9.     private byte op;
  10.     private int answer;
  11.     private String result;
  12.      
  13.     public Arithmetic(int left, int right, byte op){
  14.         this.left = left;
  15.         this.right = right;
  16.         this.op = op;
  17.     }

  18.     public int getAnswer() {
  19.         return answer;
  20.     }

  21.     public int setAnswer(int answer) {
  22.         int r = 0;
  23.         this.answer = answer;
  24.         int temp = 0;
  25.         switch(op){
  26.         case 0:
  27.             temp = left + right;
  28.             break;
  29.         case 1:
  30.             temp = left - right;
  31.             break;
  32.         case 2:
  33.             temp = left * right;
  34.             break;
  35.         case 3:
  36.             temp = left / right;
  37.             break;
  38.         }
  39.         if(temp == answer){
  40.             result = "Õyè·";
  41.             r = 1;
  42.         }else{
  43.             result = "′íÎó";
  44.             r = 0;
  45.         }
  46.         return r;
  47.     }

  48.     public int getLeft() {
  49.         return left;
  50.     }

  51.     public int getRight() {
  52.         return right;
  53.     }

  54.     public byte getOp() {
  55.         return op;
  56.     }

  57.     public String getResult() {
  58.         return result;
  59.     }

  60.     public static String convert(byte op){
  61.         String s = null;
  62.         switch(op){
  63.         case 0:
  64.             s = "+";
  65.             break;
  66.         case 1:
  67.             s = "-";
  68.             break;
  69.         case 2:
  70.             s = "*";
  71.             break;
  72.         case 3:
  73.             s = "/";
  74.             break;
  75.         }
  76.         return s;
  77.     }
  78.     @Override
  79.     public String toString() {
  80.         // TODO Auto-generated method stub
  81.         return left + "  "+ convert(op) + right + " = " + answer + result;
  82.     }
  83. }
复制代码
ArithmeticFactory.java
  1. package com.wang.domain;

  2. public class ArithmeticFactory {

  3.     public static Arithmetic createArithmetic(){
  4.         int left = (int)(Math.random() * 90 + 10);
  5.         int right = (int)(Math.random() * 90 + 10);
  6.         byte op = (byte)(Math.random() * 4);
  7.         if(op == 1){
  8.             if(left < right){
  9.                 int temp = left;
  10.                 left = right;
  11.                 right = temp;
  12.             }
  13.         }else if(op == 3){
  14.             if(left < right){
  15.                 int temp = left;
  16.                 left = right;
  17.                 right = temp;
  18.             }
  19.             left = left - left % right;
  20.         }
  21.         return new Arithmetic(left,right,op);
  22.     }
  23. }
复制代码
Clock.java
  1. package com.wang.domain;

  2. import java.awt.Graphics2D;
  3. import java.awt.RenderingHints;
  4. import java.awt.geom.Ellipse2D;
  5. import java.awt.geom.Line2D;

  6. import javax.swing.JPanel;

  7. public class Clock {
  8.     private final double x = 2;
  9.     private final double y = 2;
  10.     private final double length = 11;
  11.     private final double diameter = 26;
  12.     private double alpha = -Math.PI / 2;
  13.      
  14.     private JPanel view;
  15.      
  16.     public Clock(JPanel view){
  17.         this.view = view;
  18.     }
  19.      
  20.     public void drawClock(Graphics2D g){
  21.         g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  22.         g.draw(new Ellipse2D.Double(x,y,diameter,diameter));
  23.         g.draw(new Line2D.Double(
  24.                 x + diameter / 2,
  25.                 y + diameter / 2,
  26.                 x + diameter / 2 + length * Math.cos(alpha),
  27.                 y + diameter / 2 + length * Math.sin(alpha)));
  28.     }
  29.      
  30.     public void move(){
  31.         alpha += Math.PI / 30;
  32.         view.repaint();
  33.     }
  34. }
复制代码
ArithmeticController.java
  1. package com.wang.ctrl;

  2. import java.awt.event.ActionEvent;
  3. import java.awt.event.ActionListener;
  4. import java.io.File;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.OutputStream;
  9. import java.util.ArrayList;

  10. import javax.swing.JFileChooser;
  11. import javax.swing.JTextArea;
  12. import javax.swing.JTextField;
  13. import javax.swing.Timer;

  14. import com.wang.domain.Arithmetic;
  15. import com.wang.domain.ArithmeticFactory;
  16. import com.wang.view.ButtonsPane;
  17. import com.wang.view.NorthPane;

  18. public class ArithmeticController implements ActionListener{
  19.     private NorthPane northPane;
  20.     private JTextArea textArea;
  21.     private ButtonsPane buttonsPane;
  22.      
  23.     private Timer timer;
  24.     private final int MAX = 120;
  25.     private int counter = 0;
  26.     private int correct = 0;//
  27.      
  28.     private Arithmetic arithmetic;
  29.     private ArrayList<Arithmetic> arithmetics = new ArrayList<Arithmetic>();
  30.     public ArithmeticController(final NorthPane northPane,
  31.             final JTextArea textArea, final ButtonsPane buttonsPane){
  32.         this.northPane = northPane;
  33.         this.textArea = textArea;
  34.         this.buttonsPane = buttonsPane;
  35.         timer = new Timer(1000,this);
  36.          
  37.         northPane.addActionListenerForField(
  38.                 new ActionListener(){

  39.                     @Override
  40.                     public void actionPerformed(ActionEvent e) {
  41.                         // TODO Auto-generated method stub
  42.                         System.out.println("northPane ActionListener");
  43.                         
  44.                     }
  45.                      
  46.                 });
  47.          
  48.         final JTextField field = northPane.getNumberField();
  49.         field.addActionListener(
  50.                 new ActionListener(){

  51.                     @Override
  52.                     public void actionPerformed(ActionEvent e) {
  53.                         // TODO Auto-generated method stub
  54.                         int answer = Integer.parseInt(field.getText());
  55.                         correct += arithmetic.setAnswer(answer);
  56.                         arithmetics.add(arithmetic);
  57.                         
  58.                         arithmetic = ArithmeticFactory.createArithmetic();
  59.                         northPane.setArithmetic(arithmetic);
  60.                         field.setText("");
  61.                         field.grabFocus();
  62.                     }
  63.                      
  64.                 });
  65.          
  66.         buttonsPane.addActionListener(0,
  67.                 new ActionListener(){

  68.                     @Override
  69.                     public void actionPerformed(ActionEvent e) {
  70.                         // TODO Auto-generated method stub
  71.                         arithmetic = ArithmeticFactory.createArithmetic();
  72.                         northPane.setArithmetic(arithmetic);
  73.                         northPane.setEnabled(true);
  74.                         buttonsPane.setEnabled(0, false);
  75.                         timer.start();
  76.                     }
  77.             
  78.         });
  79.          

  80.          
  81.         buttonsPane.addActionListener(1,
  82.                 new ActionListener(){

  83.                     @Override
  84.                     public void actionPerformed(ActionEvent e) {
  85.                         // TODO Auto-generated method stub
  86.                         StringBuffer buffer = new StringBuffer();
  87.                         for(int index = 0; index < arithmetics.size(); index++){
  88.                             String s = arithmetics.get(index).toString() + "\n";
  89.                             buffer.append(s);
  90.                         }
  91.                         int score = (int)((double)correct / arithmetics.size() * 100);
  92.                         textArea.setText(buffer.toString() + score);        
  93.                     }
  94.             
  95.         });
  96.          
  97.         buttonsPane.addActionListener(2, new ActionListener(){

  98.             @Override
  99.             public void actionPerformed(ActionEvent e) {
  100.                 // TODO Auto-generated method stub
  101.                  
  102.                 JFileChooser chooser = new JFileChooser();
  103.                 int result=chooser.showSaveDialog(null);
  104.                 if(result == JFileChooser.APPROVE_OPTION){
  105.                     File file=chooser.getSelectedFile();
  106.                     if(file != null && !file.getName().equals("") && file.isFile()){
  107.                         try {
  108.                             OutputStream os = new FileOutputStream(file,true);
  109.                             for(int index = 0; index < arithmetics.size(); index++){
  110.                                 String s = arithmetics.get(index).toString() + "\n";
  111.                                 os.write(s.getBytes());
  112.                                 }
  113.                         } catch (FileNotFoundException e1) {
  114.                             // TODO Auto-generated catch block
  115.                             e1.printStackTrace();
  116.                         } catch (IOException e1) {
  117.                             // TODO Auto-generated catch block
  118.                             e1.printStackTrace();
  119.                         }
  120.                     }
  121.                 }
  122.                 buttonsPane.setEnabled(2,false);
  123.             }
  124.             
  125.         });
  126.          
  127.         buttonsPane.addActionListener(3,
  128.                 new ActionListener(){

  129.                     @Override
  130.                     public void actionPerformed(ActionEvent e) {
  131.                         // TODO Auto-generated method stub
  132.                         System.exit(0);
  133.                     }
  134.             
  135.         });
  136.     }

  137.     @Override
  138.     public void actionPerformed(ActionEvent e) {
  139.         // TODO Auto-generated method stub
  140.         northPane.move();
  141.     }
  142. }
复制代码

论坛徽章:
80
20周年集字徽章-庆
日期:2020-10-28 14:09:1215-16赛季CBA联赛之北京
日期:2020-10-28 13:32:5315-16赛季CBA联赛之北控
日期:2020-10-28 13:32:4815-16赛季CBA联赛之天津
日期:2020-10-28 13:13:35黑曼巴
日期:2020-10-28 12:29:1520周年集字徽章-周	
日期:2020-10-31 15:10:0720周年集字徽章-20	
日期:2020-10-31 15:10:07ChinaUnix元老
日期:2015-09-29 11:56:3020周年集字徽章-年
日期:2020-10-28 14:14:56
2 [报告]
发表于 2015-07-15 11:25 |只看该作者
楼主  牛人啊   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP