leehunter 发表于 2015-07-14 09:35

很简单的在线考试系统

学习java swing,写下的考试系统,主要功能就是在线答题,随机出题目。在线测试,保存题目。
MainFrame.javapackage com.wang;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import com.wang.ctrl.ArithmeticController;
import com.wang.view.ButtonsPane;
import com.wang.view.NorthPane;

public class MainFrame extends JFrame {

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

      ArithmeticController controller = new ArithmeticController(north,area,buttonsPane);
         
      Container c = this.getContentPane();
      c.add(north, BorderLayout.NORTH);
      c.add(new JScrollPane(area));
      c.add(buttonsPane,BorderLayout.SOUTH);
      this.setSize(320,500);
      this.setResizable(false);
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.setVisible(true);
    }
    /**
   * @param args
   */
    public static void main(String[] args) {
      // TODO Auto-generated method stub
      new MainFrame("速算练习系统");
    }

}ArithmeticView.javapackage com.wang.view;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

import com.wang.domain.Arithmetic;

public class ArithmeticView extends JPanel {
    private JLabel[] labels;//JLabel数组
    private JTextField field;
   
    //题目的分区哟格式四个labels,以及一个用户输入的textfield
   
    public ArithmeticView(){
      setLayout(new GridLayout(1,5,1,1));//布局
      labels = new JLabel;
      //初始化每一个labels,可见,背景等等
      for(int i = 0; i < labels.length; i++){
            labels = new JLabel();
            labels.setHorizontalAlignment(SwingConstants.CENTER);
            labels.setOpaque(true);
            labels.setBackground(Color.white);
            add(labels);//添加到arithmetic面板
      }
      field = new JTextField();
      field.setEnabled(false);//不可编辑
      add(field);
    }
   
    //设置arithmeticView里面的值,变成字符串,内容在arithmetic获取
    public void setArithmetic(Arithmetic arithmetic){
      labels.setText(String.valueOf(arithmetic.getLeft()));
      labels.setText(Arithmetic.convert(arithmetic.getOp()));
      labels.setText(String.valueOf(arithmetic.getRight()));
      labels.setText("=");
    }
    public void setEnabled(boolean b){
      field.setEnabled(b);
      if(b){
            field.grabFocus();
      }
    }
    public JTextField getNumberField(){
      return this.field;
    }
   
    public void addActionListenerForField(ActionListener listener){
      field.addActionListener(listener);
    }
    @Override
    public Dimension getPreferredSize() {
      // TODO Auto-generated method stub
      return new Dimension(330,30);
    }

    @Override
    public Dimension getMaximumSize() {
      // TODO Auto-generated method stub
      return new Dimension(340,30);
    }

    @Override
    public Dimension getMinimumSize() {
      // TODO Auto-generated method stub
      return new Dimension(320,30);
    }
   
   
}ButtonsPane.javapackage com.wang.view;

import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JPanel;

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

    private JButton[] buttons;//用JButton数组定义buttons数组
    private int size;
   
    public ButtonsPane(){
      this(2);
    }
    public ButtonsPane(int amt){//向面板增加了五个buttons
      size = amt;
      buttons = new JButton;
      for(int i = 0; i < size; i++){
            buttons = new JButton();
            add(buttons);
      }
    }
    public void setTitles(String[] titles){//把string数组里面的各个成员转变成button的标题的函数
      if(titles.length != size){
            
      }
      for(int i = 0; i < size; i++){
            buttons.setText(titles);//定义每个按钮的标题
      }
    }
   
    //定义按钮是否可用,包含两个参数,一个序号加上trueor false定义是否可用啊。
    public void setEnabled(int index,boolean b)throws RuntimeException{
      if(index < 0 || index >= size){
            throw new RuntimeException("下标越界");
      }
      buttons.setEnabled(b);
    }
   
   
    public JButton[] getButtons(){
      return buttons;
    }
   
    //为对应的按钮添加监听事件
    public void addActionListener(int index, ActionListener listener){
      buttons.addActionListener(listener);
    }
}ClockView.javapackage com.wang.view;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JPanel;

import com.wang.domain.Clock;

public class ClockView extends JPanel {
    private Clock clock;
   
    public void setClock(Clock clock){
      this.clock = clock;
    }

    @Override
    protected void paintComponent(Graphics g) {
      // TODO Auto-generated method stub
      super.paintComponent(g);
      if(clock != null){
            Graphics2D g2 = (Graphics2D)g;
            clock.drawClock(g2);
      }
    }

    public void move(){
      if(clock != null){
            clock.move();
      }
    }
    @Override
    public Dimension getPreferredSize() {
      // TODO Auto-generated method stub
      return new Dimension(30,30);
    }

   
    @Override
    public Dimension getMaximumSize() {
      // TODO Auto-generated method stub
      return new Dimension(30,30);
    }

    @Override
    public Dimension getMinimumSize() {
      // TODO Auto-generated method stub
      return new Dimension(30,30);
    }
   
}MessagePane.javapackage com.wang.view;

import java.awt.BorderLayout;

import javax.swing.JPanel;

import com.wang.domain.Clock;

public class MessagePane extends JPanel {
    private ClockView clockView;
    private TipPane tipPane;
   
    public MessagePane(){
      setLayout(new BorderLayout());
      tipPane = new TipPane("");
      clockView = new ClockView();
      Clock clock = new Clock(clockView);
      clockView.setClock(clock);
         
      add(clockView,BorderLayout.WEST);
      add(tipPane);
    }
    public void move(){
      clockView.move();
    }
}NorthPane.javapackage com.wang.view;

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

import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;

import com.wang.domain.Arithmetic;

public class NorthPane extends JPanel {//整个的北区,其中msgpane是包含的一个始终和一个提示语
    private ArithmeticView arithView;//ArithmeticView是用来展示题目的一个视图
    private MessagePane msgPane;
   
    public NorthPane(){
      setLayout(new GridLayout(2,1,1,1));
      Border border = BorderFactory.createBevelBorder(BevelBorder.LOWERED);
      msgPane = new MessagePane();
      msgPane.setBorder(border);
         
      arithView = new ArithmeticView();
      border = BorderFactory.createBevelBorder(BevelBorder.RAISED);
      arithView.setBorder(border);
         
      add(msgPane);
      add(arithView);
    }
    public void setArithmetic(Arithmetic arithmetic){
      arithView.setArithmetic(arithmetic);
    }
    public void setEnabled(boolean b){
      arithView.setEnabled(b);
    }
   
   
    public JTextField getNumberField(){
      return arithView.getNumberField();
    }
   
    //位arithView面板添加监听事件,northPane可以监听arithView面板的事件
    public void addActionListenerForField(ActionListener listener){
      arithView.addActionListenerForField(listener);
    }
   
   
    public void move(){
      msgPane.move();
    }
}TipPane.javapackage com.wang.view;

import java.awt.GridLayout;

import javax.swing.JLabel;
import javax.swing.JPanel;

public class TipPane extends JPanel {

    private JLabel label;
   
    public TipPane(String tip){
      setLayout(new GridLayout(1,1));
      label = new JLabel(tip);
      add(label);
    }
    public void setTip(String tip){
      label.setText(tip);
    }
}Arithmetic.javapackage com.wang.domain;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class Arithmetic {
    private int left;
    private int right;
    private byte op;
    private int answer;
    private String result;
   
    public Arithmetic(int left, int right, byte op){
      this.left = left;
      this.right = right;
      this.op = op;
    }

    public int getAnswer() {
      return answer;
    }

    public int setAnswer(int answer) {
      int r = 0;
      this.answer = answer;
      int temp = 0;
      switch(op){
      case 0:
            temp = left + right;
            break;
      case 1:
            temp = left - right;
            break;
      case 2:
            temp = left * right;
            break;
      case 3:
            temp = left / right;
            break;
      }
      if(temp == answer){
            result = "Õyè·";
            r = 1;
      }else{
            result = "′íÎó";
            r = 0;
      }
      return r;
    }

    public int getLeft() {
      return left;
    }

    public int getRight() {
      return right;
    }

    public byte getOp() {
      return op;
    }

    public String getResult() {
      return result;
    }

    public static String convert(byte op){
      String s = null;
      switch(op){
      case 0:
            s = "+";
            break;
      case 1:
            s = "-";
            break;
      case 2:
            s = "*";
            break;
      case 3:
            s = "/";
            break;
      }
      return s;
    }
    @Override
    public String toString() {
      // TODO Auto-generated method stub
      return left + ""+ convert(op) + right + " = " + answer + result;
    }
}ArithmeticFactory.javapackage com.wang.domain;

public class ArithmeticFactory {

    public static Arithmetic createArithmetic(){
      int left = (int)(Math.random() * 90 + 10);
      int right = (int)(Math.random() * 90 + 10);
      byte op = (byte)(Math.random() * 4);
      if(op == 1){
            if(left < right){
                int temp = left;
                left = right;
                right = temp;
            }
      }else if(op == 3){
            if(left < right){
                int temp = left;
                left = right;
                right = temp;
            }
            left = left - left % right;
      }
      return new Arithmetic(left,right,op);
    }
}Clock.javapackage com.wang.domain;

import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;

import javax.swing.JPanel;

public class Clock {
    private final double x = 2;
    private final double y = 2;
    private final double length = 11;
    private final double diameter = 26;
    private double alpha = -Math.PI / 2;
   
    private JPanel view;
   
    public Clock(JPanel view){
      this.view = view;
    }
   
    public void drawClock(Graphics2D g){
      g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      g.draw(new Ellipse2D.Double(x,y,diameter,diameter));
      g.draw(new Line2D.Double(
                x + diameter / 2,
                y + diameter / 2,
                x + diameter / 2 + length * Math.cos(alpha),
                y + diameter / 2 + length * Math.sin(alpha)));
    }
   
    public void move(){
      alpha += Math.PI / 30;
      view.repaint();
    }
}ArithmeticController.javapackage com.wang.ctrl;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;

import javax.swing.JFileChooser;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.Timer;

import com.wang.domain.Arithmetic;
import com.wang.domain.ArithmeticFactory;
import com.wang.view.ButtonsPane;
import com.wang.view.NorthPane;

public class ArithmeticController implements ActionListener{
    private NorthPane northPane;
    private JTextArea textArea;
    private ButtonsPane buttonsPane;
   
    private Timer timer;
    private final int MAX = 120;
    private int counter = 0;
    private int correct = 0;//
   
    private Arithmetic arithmetic;
    private ArrayList<Arithmetic> arithmetics = new ArrayList<Arithmetic>();
    public ArithmeticController(final NorthPane northPane,
            final JTextArea textArea, final ButtonsPane buttonsPane){
      this.northPane = northPane;
      this.textArea = textArea;
      this.buttonsPane = buttonsPane;
      timer = new Timer(1000,this);
         
      northPane.addActionListenerForField(
                new ActionListener(){

                  @Override
                  public void actionPerformed(ActionEvent e) {
                        // TODO Auto-generated method stub
                        System.out.println("northPane ActionListener");
                        
                  }
                     
                });
         
      final JTextField field = northPane.getNumberField();
      field.addActionListener(
                new ActionListener(){

                  @Override
                  public void actionPerformed(ActionEvent e) {
                        // TODO Auto-generated method stub
                        int answer = Integer.parseInt(field.getText());
                        correct += arithmetic.setAnswer(answer);
                        arithmetics.add(arithmetic);
                        
                        arithmetic = ArithmeticFactory.createArithmetic();
                        northPane.setArithmetic(arithmetic);
                        field.setText("");
                        field.grabFocus();
                  }
                     
                });
         
      buttonsPane.addActionListener(0,
                new ActionListener(){

                  @Override
                  public void actionPerformed(ActionEvent e) {
                        // TODO Auto-generated method stub
                        arithmetic = ArithmeticFactory.createArithmetic();
                        northPane.setArithmetic(arithmetic);
                        northPane.setEnabled(true);
                        buttonsPane.setEnabled(0, false);
                        timer.start();
                  }
            
      });
         

         
      buttonsPane.addActionListener(1,
                new ActionListener(){

                  @Override
                  public void actionPerformed(ActionEvent e) {
                        // TODO Auto-generated method stub
                        StringBuffer buffer = new StringBuffer();
                        for(int index = 0; index < arithmetics.size(); index++){
                            String s = arithmetics.get(index).toString() + "\n";
                            buffer.append(s);
                        }
                        int score = (int)((double)correct / arithmetics.size() * 100);
                        textArea.setText(buffer.toString() + score);      
                  }
            
      });
         
      buttonsPane.addActionListener(2, new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
               
                JFileChooser chooser = new JFileChooser();
                int result=chooser.showSaveDialog(null);
                if(result == JFileChooser.APPROVE_OPTION){
                  File file=chooser.getSelectedFile();
                  if(file != null && !file.getName().equals("") && file.isFile()){
                        try {
                            OutputStream os = new FileOutputStream(file,true);
                            for(int index = 0; index < arithmetics.size(); index++){
                              String s = arithmetics.get(index).toString() + "\n";
                              os.write(s.getBytes());
                              }
                        } catch (FileNotFoundException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        } catch (IOException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        }
                  }
                }
                buttonsPane.setEnabled(2,false);
            }
            
      });
         
      buttonsPane.addActionListener(3,
                new ActionListener(){

                  @Override
                  public void actionPerformed(ActionEvent e) {
                        // TODO Auto-generated method stub
                        System.exit(0);
                  }
            
      });
    }

    @Override
    public void actionPerformed(ActionEvent e) {
      // TODO Auto-generated method stub
      northPane.move();
    }
}

baopbird2005 发表于 2015-07-15 11:25

楼主牛人啊   
页: [1]
查看完整版本: 很简单的在线考试系统